Dalam Django, anda boleh mencipta model yang berada dalam pangkalan data yang berbeza. Walau bagaimanapun, terdapat had apabila menggunakan perhubungan utama asing antara model ini.
Pertimbangkan contoh berikut:
<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>
Selepas menyediakan penghala pangkalan data anda, anda mungkin menghadapi ralat apabila memberikan kunci asing:
<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>
Ini kerana Django tidak menyokong perhubungan kunci asing silang pangkalan data. Kunci asing dan perhubungan banyak-ke-banyak mestilah dalaman kepada satu pangkalan data.
Jika anda mengalami ralat ini walaupun anda telah membahagikan model anda dengan betul, ia mungkin disebabkan oleh pepijat dalam kelas ForeignKey Django. Untuk menyelesaikannya, anda boleh menggunakan tampalan pada projek anda:
In validate() method # Old Code assert target._database == self.opts.db # New Code assert target._database == self.opts.db or target._database is None
Untuk mengelakkan pengehadan silang pangkalan data, anda boleh menggunakan alternatif pendekatan. Pertimbangkan untuk mencipta model yang mengabstrakkan perhubungan kunci asing, seperti:
<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>
Dengan menggunakan model asas abstrak untuk menentukan perhubungan kunci asing, anda boleh mencipta berbilang subkelas khusus pangkalan data bagi model abstrak. Ini membolehkan anda mengekalkan perhubungan sambil membahagikan data anda merentas berbilang pangkalan data.
Atas ialah kandungan terperinci Bolehkah Model Django dengan Kunci Asing Wujud dalam Pangkalan Data Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!