在 Django 中,您可以创建驻留在不同数据库中的模型。但是,在这些模型之间使用外键关系时存在限制。
考虑以下示例:
<code class="python"># in 'urls' database class LinkModel(models.Model): host_id = models.IntegerField() path = models.CharField(max_length=255) # in default database class NewsModel(models.Model): title = models.CharField(max_length=50) link = models.ForeignKey(LinkModel)</code>
设置数据库路由器后,您可能会遇到错误:分配外键:
<code class="python">newsItem.link = LinkModel.objects.using('urls').get(id=1) # Cannot assign "LinkModel: /": instance is on database "default", value is on database "urls"</code>
这是因为Django不支持跨数据库外键关系。外键和多对多关系必须位于单个数据库的内部。
如果即使已分区也遇到此错误如果您的模型正确,这可能是由于 Django 的ForeignKey 类中的错误所致。要解决此问题,您可以向您的项目应用补丁:
In validate() method # Old Code assert target._database == self.opts.db # New Code assert target._database == self.opts.db or target._database is None
为了避免跨数据库限制,您可以使用替代方案方法。考虑创建一个抽象外键关系的模型,例如:
<code class="python">class AbstractLinkModel(models.Model): host_id = models.IntegerField() path = models.CharField(max_length=255) class LinkModel(AbstractLinkModel): class Meta: db_table = 'links' app_label = 'testapp' class NewsModel(models.Model): title = models.CharField(max_length=50) link = models.ForeignKey(AbstractLinkModel)</code>
通过使用抽象基础模型来定义外键关系,您可以创建抽象模型的多个特定于数据库的子类。这使您可以在跨多个数据库对数据进行分区时维护关系。
以上是具有外键的 Django 模型可以存在于不同的数据库中吗?的详细内容。更多信息请关注PHP中文网其他相关文章!