一 .ORM一對一表(OneToOneField)
1.創建ORM表
一對一關系與多對一關系非常相似。如果你在模型中定義一個OneToOneField,該模型的實例將可以通過該模型的一個簡單屬性訪問關聯的模型。
class Person(models.Model): name = models.CharField(max_length=20) class PersonDetail(models.Model): age = models.IntegerField(10) email = models.EmailField() person = models.OneToOneField(Person) # person = models.ForeignKey(Person, unique=True)
2. 查詢
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。
3. 一對一表 (案例 增刪改查)
from django.db import models # 母表 class Colors(models.Model): colors = models.CharField(max_length=10) def __str__(self): return self.colors # 一對一關系,每一個球都只有一種顏色,每種顏色的球只有一個 class Ball(models.Model): # 球的顏色與 Color 母表的顏色一一對應 ball_color = models.OneToOneField('Colors') # 描述 description = models.CharField(max_length=10) def __str__(self): return self.description
查詢數據
子表查詢母表:
from myApp.models import Colors, Ball
方法一: 正向查找
# 查詢“1號球”對應的顏色 # 獲取一個子表對象 >>> b = Ball.objects.get(description="1號球") <Ball: 1號球>
# 獲取對應的母表對象
>>> b.ball_color <Colors: red>
方法二:反向查找
# 獲取“1號球”的 Colors 對象 >>> c = Colors.objects.get(ball__description="1號球") <Colors: red> >>> c.colors 'red'
母表查詢子表:
方法一: 反向查找 # 查詢紅色球對應的描述 # 獲取某 Colors 對象 >>> c = Colors.objects.get(colors="red") <Colors: red> # 獲取對應的 Ball 對象 # 這里默認用子表名稱的小寫,如果設定了 related_name 則使用 related_name >>> c.ball <Ball: 1號球>
方法二: 正向查找
# 獲取顏色為紅的 Ball 對象 >>> b = Ball.objects.get(ball_color__colors="red") <Ball: 1號球> >>> b.description '1號球'
添加數據
# 創建一個新的 Colors 對象 c = Colors.objects.create(colors="blue") # 創建一個新 Ball 對象 Ball.objects.create(ball_color=c,description="2號球")
刪除數據
# 刪除某個 Ball 對象 Ball.objects.get(description="2號球").delete() # 刪除某個 Colors 對象 Colors.objects.get(colors="blue").delete() # 清空一張表 Colors.objects.all().delete()
修改數據
c = Colors.objects.get(colors="red") c.colors = 'yellow' c.save()
# save() 方法 c = Colors.objects.create(colors="green") b = Ball.objects.get(description="1號球") b.color = c b.description = "3號球" b.save()
# filter() 方法 b = Ball.objects.filter(description="3號球") # 注意:update() 和 delete() 是 QuerySet 的方法 b.update(ball_color=c,description="1號球")