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