1. 程式人生 > >Django的ORM基本操作詳解

Django的ORM基本操作詳解

.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)

class
Student(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基本操作詳解