django创建多对多表三种方法,和ORM操作增删改查

1、

https://blog.csdn.net/weixin_43159092/article/details/105746294

https://www.runoob.com/django/django-orm-2.html

2、

Django first()和last() F查询以及Q查询

https://www.cnblogs.com/hooo-1102/p/12078344.html

多表操作,跨表查询

https://blog.csdn.net/qq_39253370/article/details/105184885

orm跨表操作

https://www.cnblogs.com/ywsun/articles/10799411.html

______________________________________________________________

不管是哪种方法,都能完成你需要的操作,只不过方式不同。根据自己的需要选择一种就行了。

第一种:自带的ManyToManyField

django会帮你在数据库自动生成一个老师和班级的关系表,但不显示在models.py里面,所以不能直接操作关系表,但是可以间接操作。

不足之处:关系表只能有三个字段,比如我想在关系表中添加一个上课时间的字段,那么就不能用此方法。

class teacher(models.Model):
t_name = models.CharField(max_length=20,default="0")
tea_cla = models.ManyToManyField(to='class')

class classes(models.Model):
c_name = models.CharField(max_length=20,default="0")

增 add()方法
给AAA老师增加一门课,id为3:

obj = models.teacher.objects.get(t_name = 'AAA')
obj.tea_cla.add(3)

add(1)或add(2,3)或列表add(*[1,2])

删 remove()方法
AAA老师不上某课了

obj.tea_cla.remove()#用法同add()

改(重置) set()方法
重新决定AAA老师上哪几门课

obj.tea_cla.set([列表类型])

查 all()和filter()
查询AAA老师上哪几门课

q = obj.tea_cla.all()
#q是AAA老师教的所有班级的对象

#也可以进一步筛选,查询AAA老师教的线代
w = obj.tea_cla.filter(c_name = '线代')

清空 clear()
将AAA老师的课清空

obj.tea_cla.clear()

反向查询,通过课程查老师 _set

方法与上面一样,只是方向不同,注意_set

查询教线代的老师有哪些

class_obj = models.classes.objects.get(c_name = '线代')
v = class_obj.teacher_set.all()

第二种:自己写关系表

注意get()和filter()的区别,filter返回对象的列表,get返回一个对象,当有多个返回值会报错。

class teacher(models.Model):
t_name = models.CharField(max_length=20,default="0")

class classes(models.Model):
c_name = models.CharField(max_length=20,default="0")

class tea_cla(models.Model):
t = models.ForeignKey(to='teacher',on_delete=models.CASCADE)
c = models.ForeignKey(to='classes',on_delete=models.CASCADE)

增加删除修改就不说了,跟单表操作差不多,注意下外键约束即可。

查询
1.两次外键连表查询
for循环里面操作数据库,性能不高

#获取AAA老师的对象
obj = models.teacher.objects.get(t_name = 'AAA')
#获取关系表所有AAA老师教的课的对象
class_list = obj.tea_cla_set.all()
#再来个循环就能拿到
for item in class_list:
print(item.c.c_name)

2.以关系表为核心查询
注意双下划线的用法

#获取关系表中AAA老师相关对象
class_list = models.tea_cla.objects.filter(t__t_name = 'AAA')
##再来个循环就能拿到
for item in class_list:
print(item.c.c_name)

3.字典或列表(合并两次跨表)

class_list = models.tea_cla.objects.filter(t__t_name = 'AAA').values('c__c_name')
#字典类型,列表就用valueslist
for item in class_list:
print(item['c__c_name'])

4.对象(与3差不多)

class_list = models.tea_cla.objects.filter(t__t_name = 'AAA').select_related('c')
#对象类型
for obj in class_list:
print(obj.c.c_name)

第三种:两者结合

既自己写关系表,又使用ManyToManyField

class teacher(models.Model):
t_name = models.CharField(max_length=20,default="0")
z = models.ManyToManyField(to='classes',through='tea_cla',through_fields=('t,c'))

class classes(models.Model):
c_name = models.CharField(max_length=20,default="0")

class tea_cla(models.Model):
t = models.ForeignKey(to='teacher',on_delete=models.CASCADE)
c = models.ForeignKey(to='classes',on_delete=models.CASCADE)

through和through_fields:表示通过tea_cla表的t和c两个字段

操作方法是前两种的总和
add() remove() set() 无法使用
clear() all() 可以使用
————————————————

2、

原文地址:https://www.cnblogs.com/yaok430/p/14704672.html