class与teacher 多对多。由class对象添加/删除多个teacher


class Classes(models.Model):
    """
    班级表
    """
    title=models.CharField(max_length=32)
    teachers=models.ManyToManyField("Teacher")

生成manytomany表
草稿 orm  manytomany操作

c1=Classes.objects.filter(id=1).first()   #获取1个class对象
c1.teachers.add(1)                              #添加1个teacher对象,teacher id 为1
c1.teachers.clear()                        # 清空c1信息

ts=Teacher.objects.all()             # 获取tearcher对象列表
c1.teachers.add(*ts)                   # add 1个或者add(*list),注意*号

c1.teachers.remove(3)         #移除
c1.teachers.set([3,])            # 仅设置为3,其余全删除。注意列表形式
        models.Classes.objects.filter(id=class_id).update(title=class_title)
        models.Classes.objects.filter(id=class_id).first().teachers.set(selected_teacher_idlist)

part2

manytomany 自动生成第三张表时,只有多对多2个字段,不利于扩展
解决:再创建第三张表模型,通过through关键字关联。
场景如: 学生与兴趣小组 多对多,+ 创建时间。

class A(models.Model):
    name=models.CharField(max_length=32)

    def __str__(self):
        return self.name
#
class B(models.Model):
    name=models.CharField(max_length=32)

class C(models.Model):
    name=models.CharField(max_length=32)
    f=models.ManyToManyField(to=A,related_name='fa',through='D',through_fields=('namec','namea'))

class D(models.Model):
    namea=models.ForeignKey(A)
    nameb=models.ForeignKey(B)
    namec=models.ForeignKey(C)

test.py

from django.test import TestCase

# Create your tests here.
from  pro65.wsgi import *
from app01 import  models

c=models.C.objects.first()
print(c.f.all())

a=models.A.objects.first()
print(a.fa.all())

草稿 orm manytomany操作_第1张图片