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!