Home >Database >Mysql Tutorial >Can Django Models with Foreign Keys Exist in Different Databases?
In Django, you can create models that reside in different databases. However, there are limitations when it comes to using foreign key relationships between these models.
Consider the following example:
<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>
After setting up your database router, you may encounter an error when assigning the foreign key:
<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>
This is because Django does not support cross-database foreign key relationships. Foreign keys and many-to-many relationships must be internal to a single database.
If you experience this error even though you have partitioned your models correctly, it may be due to a bug in Django's ForeignKey class. To resolve it, you can apply a patch to your project:
In validate() method # Old Code assert target._database == self.opts.db # New Code assert target._database == self.opts.db or target._database is None
To avoid the cross-database limitations, you can use an alternative approach. Consider creating a model that abstracts the foreign key relationship, such as:
<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>
By using an abstract base model to define the foreign key relationship, you can create multiple database-specific subclasses of the abstract model. This allows you to maintain the relationships while partitioning your data across multiple databases.
The above is the detailed content of Can Django Models with Foreign Keys Exist in Different Databases?. For more information, please follow other related articles on the PHP Chinese website!