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