Bila hendak Memilih `OneToOneField()` lwn `ForeignKey(unique=True)` dalam Django?

Barbara Streisand
Lepaskan: 2024-11-07 03:23:02
asal
119 orang telah melayarinya

When to Choose `OneToOneField()` vs `ForeignKey(unique=True)` in Django?

Membandingkan OneToOneField() dan ForeignKey() Django

Django menawarkan dua mekanisme utama untuk mewujudkan hubungan antara model: OneToOneField() dan ForeignKey( ). Walaupun kedua-duanya membenarkan persatuan satu dengan satu, mereka berbeza dalam tingkah laku dan akibatnya.

OneToOneField() dan ForeignKey(unique=True)

Pada dasarnya, OneToOneField(SomeModel) berfungsi menyerupai ForeignKey(SomeModel, unique=True). Dalam kedua-dua kes, anda menguatkuasakan hubungan unik antara objek. Walau bagaimanapun, terdapat perbezaan yang ketara:

OneToOneField menyediakan perhubungan dua arah, dengan mendapatkan semula objek di bahagian "terbalik" secara langsung mengembalikan objek tunggal yang sepadan.

car = Car.objects.get(name='Audi')
engine = car.engine # Returns the corresponding Engine object directly
Salin selepas log masuk

ForeignKey dengan unique=True, sebaliknya, mengekalkan hubungan satu arah. Mendapatkan semula objek di bahagian "terbalik" mengembalikan QuerySet.

car2 = Car2.objects.get(name='Mazda')
engines = car2.engine2_set.all() # Returns a QuerySet containing the corresponding Engine2 object
Salin selepas log masuk

Contoh Ilustrasi

Pertimbangkan dua model: Kereta dan Enjin, di mana Kereta menggunakan OneToOneField() dan Car2 menggunakan ForeignKey(unique=True). Melaksanakan kod berikut menunjukkan perbezaan:

# OneToOneField
car = Car.objects.get(name='Audi')
engine = Engine.objects.get(name='Diesel')
print(engine.car)  # Prints "Audi"

# ForeignKey with unique=True
car2 = Car2.objects.get(name='Mazda')
engine2 = Engine2.objects.get(name='Wankel')
print(engine2.car2_set.all())  # Prints "[<Car2: Mazda>]"
Salin selepas log masuk

Kod Model untuk Rujukan

class Engine(models.Model):
    name = models.CharField(max_length=25)

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine)

class Engine2(models.Model):
    name = models.CharField(max_length=25)

class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True)
Salin selepas log masuk

Memilih Perhubungan yang Betul

Akhirnya, pilihan antara OneToOneField() dan ForeignKey() bergantung pada model data khusus anda dan kes penggunaan. Jika anda memerlukan perhubungan satu dengan satu yang benar di mana akses terus kepada satu objek terbalik adalah penting, maka OneToOneField() disyorkan. Untuk situasi di mana pertanyaan kompleks atau akhirnya perhubungan berbilang objek pada bahagian "terbalik" diperlukan, ForeignKey() dengan unique=True adalah lebih sesuai.

Atas ialah kandungan terperinci Bila hendak Memilih `OneToOneField()` lwn `ForeignKey(unique=True)` dalam Django?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!