十一 .Django 一對一表OneToOneField (ORM)


一 .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號球")

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM