Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bila hendak Memilih `OneToOneField()` lwn `ForeignKey(unique=True)` dalam Django?

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

Barbara Streisand
Barbara Streisandasal
2024-11-07 03:23:02120semak imbas

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

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

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>]"

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)

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!

Kenyataan:
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