首頁 > 資料庫 > mysql教程 > 具有外鍵的 Django 模型可以存在於不同的資料庫中嗎?

具有外鍵的 Django 模型可以存在於不同的資料庫中嗎?

Linda Hamilton
發布: 2024-10-29 12:22:29
原創
859 人瀏覽過

 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板