一對一關系
一對一關系與多對一關系非常相似。如果你在模型中定義一個OneToOneField,該模型的實例將可以通過該模型的一個簡單屬性訪問關聯的模型。
class Person(models.Model): name = models.CharField(max_length=20) class PersonDetail(models.Model): age = models.IntegerField(10) email = models.EmailField()
# person = models.ForeignKey(Person, unique=True)
person = models.OneToOneField(Person)
二、 查詢
def one(request):
# 查詢alex的用戶信息 # 前向查詢 ret = models.PersonDetail.objects.get(id=1) # ret = models.PersonDetail.objects.get(id=models.Person.objects.get(name='alex').id)
# 這里的person是表中的關聯外鍵的字段並非類名字 print(ret.person) # Person object 封裝的Person對象 print(ret.person.name, ret.age, ret.email)
# 查詢alex的用戶信息 # 反向查詢 obj = models.Person.objects.get(name='alex') # persondetail 類名字的小寫 print(obj.persondetail) # PersonDetail object print(obj.name, obj.persondetail.email, obj.persondetail.age) return HttpResponse('OK')
“反向”查詢中有所不同。一對一關系中的關聯模型同樣具有一個管理器對象,但是該管理器表示一個單一的對象而不是對象的集合。
一對一的方式原理上是 ForeignKey + unique=True。但是既然是外鍵 那么一對多的反向查詢方式應該和一對一的反向查詢方式相同,而實際上不是這樣的,一對一的反向查詢方式是 obj.persondetail 對象.類名小寫 ,沒有_set。