Django的ORM基本操作詳解
阿新 • • 發佈:2019-02-16
.com set lte end 所有 lis 以及 ted pre
一對多關系
-------------------models.py---------------- from django.db import models class Classes(models.Model): # 班級表 title = models.CharField(max_length=32) m = models.ManyToManyField(‘Teachers‘) # 多對多 class Teachers(models.Model): # 老師表 name = models.CharField(max_length=32) classStudent(models.Model): # 學生表 username = models.CharField(max_length=32) age = models.IntegerField() gender = models.BooleanField() cs = models.ForeignKey("Classes",on_delete=models.CASCADE) #cs是Classes的一個對象
表中的數據:
Classes Student
示例:
-查詢所有學生的名稱以及其所在班級的名稱,QuerySet
stu_list = Student.objects.all()# [obj,obj,ibj,obj] 裏面是一個一個的對象 stu_list = Student.objects.all().values(‘id‘,‘username‘) # [{‘id‘:1,‘username‘:‘xx‘},{‘id‘:‘‘,‘username‘:‘‘}...] 裏面是字典 stu_list = Student.objects.all().values_list(‘id‘,‘username‘) [(1,‘小王‘),(2,‘小明‘)...] # 裏面是元組 # 正解 stu_list = Student.objects.all().values(‘username‘,‘cs__title‘)
# <QuerySet [{‘username‘: ‘小王‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小明‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小劉‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小李‘, ‘cs__title‘: ‘3班‘}]> for row in stu_list: # 裏面元素是字典 print(row[‘username‘],row[‘cs__title‘])
這裏的跨表操作只是跨了兩張表,跨三張表也一樣的道理,例如,假如還有一張校區表School(有字段name),Classes表
中的另一個字段sch是外鍵,依賴於校區表,那麽,找到所有學生的姓名、班級、校區則是:
stu_list = Student.objects.all().values(‘username‘,‘cs__title‘,‘cs__title__name‘)
正反向查詢(通過雙下劃線跨表查詢)
# 找到2班的學生 # -----正向----- a=models.Student.objects.filter(cs__title=‘2班‘) # 3個Student對象 print(a) # 正向查 # <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]> #------反向------ obj = models.Classes.objects.filter(title=‘2班‘).first() print(obj.student_set.all()) # 反向查
# <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]
總結:
1、類代表數據庫的表
2、類的對象代指數據庫的一行記錄
3、ForeignKey(外鍵)字段代指關聯表中的一行數據(類的對象)
4、ManyToManyField字段,自動生成第三張表,依賴關聯表對第三張表間接操作
5、 -正向:cs字段 (推薦使用)
-反向:小寫類名_set(還有一個 .all()方法,返回所有對象) 默認是這個名字,但也可以修改,
Student表的外鍵中有一個 related_name= 參數,可換成想要的名字。反向查只需
小寫類名_set換成修改好的名字即可,
Django的ORM基本操作詳解