ホームページ > データベース > mysql チュートリアル > 外部キーを持つ Django モデルは異なるデータベースに存在できますか?

外部キーを持つ Django モデルは異なるデータベースに存在できますか?

Linda Hamilton
リリース: 2024-10-29 12:22:29
オリジナル
901 人が閲覧しました

 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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート