A OneToOneField
rất giống với ForeignKey
với unique=True
. Trừ khi bạn đang làm nhiều thừa kế bảng, trong trường hợp này bạn phải sử dụng OneToOneField
, sự khác biệt thực sự duy nhất là api để truy cập các đối tượng liên quan.
Trong Django docs nó nói:
Về mặt lý thuyết, điều này cũng tương tự như một ForeignKey
với unique=True
, nhưng "đảo ngược" bên của mối quan hệ sẽ trực tiếp trả về một đối tượng duy nhất.
Hãy hiển thị điều đó có nghĩa là với ví dụ. Cân nhắc hai mô hình, Person
và Address
. Giả sử mỗi người có một địa chỉ duy nhất.
class Person(models.Model):
name = models.CharField(max_length=50)
address = models.ForeignKey('Address', unique=True)
class Address(models.Model):
street = models.CharField(max_length=50)
Nếu bạn bắt đầu với một người, bạn có thể truy cập vào địa chỉ một cách dễ dàng:
address = person.address
Tuy nhiên, nếu bạn bắt đầu với một địa chỉ, bạn phải đi qua trình quản lý person_set
để có được người đó.
person = address.person_set.get() # may raise Person.DoesNotExist
Bây giờ hãy thay thế ForeignKey
bằng OneToOneField
.
class Person(models.Model):
name = models.CharField(max_length=50)
address = models.OneToOneField('Address')
class Address(models.Model):
street = models.CharField(max_length=50)
Nếu bạn bắt đầu với một người, bạn có thể truy cập vào địa chỉ trong cùng một cách:
address = person.address
Và bây giờ, chúng ta có thể truy cập vào người từ địa chỉ dễ dàng hơn.
person = address.person # may raise Person.DoesNotExist
@alan Không đủ rõ ràng trong các câu trả lời khác như câu trả lời của Alasdir này làm rõ khái niệm rất tốt – Hafiz