Django中ORM多對多表的操作


自己創建第三張表建立多對多關系

表的創建

# 老師表和學生表可以是一個多對多的關系,建表時可以手動建立第三張表建立關聯

class Student(models.Model):
    name = models.CharField(max_length=32, null=True)
    age = models.CharField(max_length=32, null=True)

class Teacher(models.Model):
    name = models.CharField(max_length=32, null=True)
    gender = models.CharField(max_length=32, null=True)

# 建立第三張表,把前兩張表關聯起來
class TeacherToStudent(models.Model):
    stu = models.ForeignKey('Student', null=True)
    teac = models.ForeignKey('Teacher', null=True)

增刪改查的操作

# 增  直接通過models.類名.objects.create進行添加
models.Student.objects.create(name="xxx",age=12)
models.Teacher.objects.create(name="ooo",gender="")
models.TeacherToStudent.objects.create(stu_id=1, teac_id=1)

# 刪  找出對象.delete()  ,並且把對應關系也刪了
models.Teacher.objects.filter(id=4).delete()
models.TeacherToStudent.objects.filter(teac_id=4).delete()

# 改 一樣不同的表分開操作
models.Teacher.objects.filter(id=3).update(name="xoxo")

# 查  ,如果我想查詢一個學生同時被多少個老師教,有圖下三種方法
# 1:
res = models.Student.objects.filter(id=2).all()   # 先查出符合條件的學生
for row in res:
    print(row.name)
    r = row.teachertostudent_set.all()  # (反查)表示第三張表中所有學生id為2的行
    for i in r:
        # i.teac    # (正查)表示對應的老師表里的一列
        print(i.teac.name)   # 查出學生id為2對應的所有老師

# 2:
res = models.TeacherToStudent.objects.filter(stu__name="cao").all()
# 查出來的是學生名字為cao對應的所有的行(神奇的雙下划線)
for row in res:
    print(row.stu.name, row.teac.name)  # 找到學生和老師的對應關系

# 3:
res = models.TeacherToStudent.objects.filter(stu__name="li").values("teac__name")
# 查出來的QuerySet 列表,里面包含字典
print(res)

Django中方法創建多對多關系

表的創建

# 表的創建,創建一個班級和課程的多對多關系
# 通過django中的ManyToManyField創建多對多關系,字段放在兩個列中任意一個都可以
class Classes(models.Model):
    name = models.CharField(max_length=32, null=True)
    course = models.ManyToManyField('Course')
    
class Course(models.Model):
    name = models.CharField(max_length=32, null=True)

增刪改查的操作

# 增 先要找到對應的班級或者課程對象
obj = models.Classes.objects.filter(id=4).first()
# 找到之后通過建表時的course.add進行添加,要把課程id放在列表里打散傳進去
obj.course.add(1)   # 增加一個
obj.course.add(*[2,3])    # 增加多個

# 刪 找到對象.建表時的屬性名.clear() 刪除所有
obj = models.Classes.objects.filter(id=4).first()
obj.course.clear()

# 重置(改),也是找到對象,通過.set()方法,里面放一個列表
obj = models.Classes.objects.filter(id=3).first()
obj.course.set([1,2,3])

# 查 對於模型類中有ManyToManyField字段的表來說
res = models.Classes.objects.all()  # 先查出所有的對象
for row in res:
    print(row.name)
    for i in row.course.all():  # row.course.all()就是每個班級對應的所有課程對象
        print(i.name)
#對於模型類中沒有ManyToManyField字段的表來說
res = models.Course.objects.all()   # 也是先查出所有的對象
for row in res:
    print("===================")
    print(row.name)
    for i in row.classes_set.all(): # 每個學科對應的所有班級
        print(i.name)

注:這兩種方法建立多對多關系都是可以的,分情況考慮用哪一個,如果表之間的關系簡單,

  第三張表中不需要加入除兩張表id以外的字段可以用django創建但是如果表關系比較復雜,

  並且,第三張表中還需要加入一些其他的字段,就需要用到我們自定義的多對多關系(

  手動創建第三張表),可以自定制第三張表的結構


免責聲明!

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



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