首页 > 数据库 > mysql教程 > 具有外键的 Django 模型可以存在于不同的数据库中吗?

具有外键的 Django 模型可以存在于不同的数据库中吗?

Linda Hamilton
发布: 2024-10-29 12:22:29
原创
889 人浏览过

 Can Django Models with Foreign Keys Exist in Different Databases?

在不同数据库中使用具有外键的 Django 模型

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板