Rumah > pangkalan data > tutorial mysql > Bolehkah Model Django dengan Kunci Asing Wujud dalam Pangkalan Data Berbeza?

Bolehkah Model Django dengan Kunci Asing Wujud dalam Pangkalan Data Berbeza?

Linda Hamilton
Lepaskan: 2024-10-29 12:22:29
asal
891 orang telah melayarinya

 Can Django Models with Foreign Keys Exist in Different Databases?

Menggunakan Model Django dengan Kunci Asing dalam Pangkalan Data Berbeza

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Ini kerana Django tidak menyokong perhubungan kunci asing silang pangkalan data. Kunci asing dan perhubungan banyak-ke-banyak mestilah dalaman kepada satu pangkalan data.

Menyelesaikan Masalah Pepijat

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
Salin selepas log masuk

Penyelesaian

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan