<p>您是正确的,跨数据库的外键在Django-ORM中是一个问题,在某种程度上在db级别也是一个问题。在</p>
<p>基本上您已经有了答案:<em>“我在文档模型/类中可视化了一个函数,它能够检索匹配的数据”</em></p>
<p>我会这样做的:</p>
<pre><code>class RemoteObject(object):
def __init__(self, remote_model, remote_db, field_name):
# assumes remote db is defined in Django settings and has an
# associated Django model definition:
self.remote_model = remote_model
self.remote_db = remote_db
# name of id field on model (real db field):
self.field_name = field_name
# we will cache the retrieved remote model on the instance
# the same way that Django does with foreign key fields:
self.cache_name = '_{}_cache'.format(field_name)
def __get__(self, instance, cls):
try:
rel_obj = getattr(instance, self.cache_name)
except AttributeError:
system_id = getattr(instance, self.field_name)
remote_qs = self.remote_model.objects.using(self.remote_db)
try:
rel_obj = remote_qs.get(id=system_id)
except self.remote_model.DoesNotExist:
rel_obj = None
setattr(instance, self.cache_name, rel_obj)
if rel_obj is None:
raise self.related.model.DoesNotExist
else:
return rel_obj
def __set__(self, instance, value):
setattr(instance, self.field_name, value.id)
setattr(instance, self.cache_name, value)
class Document(models.Model:
name = models.CharField(max_length=200)
system_id = models.IntegerField()
system = RemoteObject(System, 'system_db_name', 'system_id')
</code></pre>
<p>您可能认识到上面的<code>RemoteObject</code>类实现了Python的描述符协议,更多信息请参见这里:<br/>
<a href="https://docs.python.org/2/howto/descriptor.html" rel="nofollow">https://docs.python.org/2/howto/descriptor.html</a></p>
<p>用法示例:</p>
^{pr2}$
<p>更进一步,您可以编写一个自定义的db路由器:<br/>
<a href="https://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-routers" rel="nofollow">https://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-routers</a></p>
<p>这将允许您通过将<code>System</code>模型的所有读取路由到适当的数据库来消除代码中的<code>using('system_db_name')</code>调用。在</p>