Django中多对多查询方式

来源:互联网 发布:用ipad怎么开淘宝网店 编辑:程序博客网 时间:2024/05/29 09:42

使用版本python3.5+django1.11.4
创建django-admin startproject DjangoORM
创建App ./manage.py startapp ORM

from django.db import modelsclass Goods(models.Model):#商品    g_name = models.CharField(max_length=20)    g_price = models.DecimalField(max_digits=5, decimal_places=2)    gc = models.ForeignKey("Category", null=True, on_delete=models.SET_NULL)#gc为外键,类别表为母表class Category(models.Model):#类别    c_name = models.CharField(max_length=20)class Store(models.Model):#商家    s_name = models.CharField(max_length=30)    s_detail = models.TextField(blank=True, null=True)    sc = models.ManyToManyField("Category")#与类别表进行多对多关联

多对多增删改查同时也适用一对多,一对一,修改少量参数即可

1.增添加商家Store.objects.create(s_name="商家A", s_detail="物美价廉,抄底折扣。。。。")Out[2]: <Store: Store object>Store(s_name="商家B", s_detail="大促销").save()添加类别Category.objects.create(c_name="电脑整机")<Category: Category object>Category(c_name="文具耗材").save()增与改(增添子表或母表数据参照一对一的增,多对多重点在于关系表的对应关系变更)创建商家C添加全部分类Store.objects.create(s_name="商家C").sc.add(*(Category.objects.all()))#如果商户已存在则把create改成getstore = Store.objects.get(s_name="商家C")store.sc=(Category.objects.all())store.save()创建商家D添加指定分类store = Store.objects.create(s_name="商家D")category = Category.objects.filter(c_name__in=["电脑整机","文具耗材"])#单个改成get,全部改成allstore.sc.add(*category)#add是追加模式store.sc.clear()#清空此商家的商品#让指定商品分类添加指定的商家,反向查询store = Store.objects.create(s_name="商家E")category = Category.objects.get(c_name="电脑整机")category.store_set.add(store)效果与上面一样让所有商家都添加这个分类stores = Store.objects.all()category = Category.objects.get(c_name="电脑整机")category.store_set.add(*stores)category.store_set.clear()#让所有商家去除这个分类category.store_set.all().delete()#是删除store_set的所有商家#只有子表才有"子表名小写_set"的写法,得到的是一个QuerySet集合,后边可以接.add(),.remove(),.update(),.delete(),.clear()

2.查

(Store.objects.get(s_name="商家C")).sc.all()<QuerySet [<Category: Category object>, <Category: Category object>]>Category.objects.filter(store__s_name="商家C")<QuerySet [<Category: Category object>, <Category: Category object>]>#查找指定商家下面的所有分类Store.objects.get(s_name="商家C").sc.all()#写法:子表对象.子表多对多字段.过滤条件(all()/filter())<QuerySet [<Category: Category object>, <Category: Category object>]>反向查询Category.objects.filter(store__s_name="商家C")Out[25]: <QuerySet [<Category: Category object>, <Category: Category object>]>#母表对象.filter(子表表名小写__子表字段名="过滤条件")从分类查询,查看那些商家里面发布指定的某一个分类(Category.objects.get(c_name="电脑整机")).store_set.all()<QuerySet [<Store: Store object>, <Store: Store object>]>Store.objects.filter(sc=Category.objects.get(c_name="电脑整机"))<QuerySet [<Store: Store object>, <Store: Store object>]>Store.objects.filter(sc__c_name="电脑整机")#filter(子表外键字段__母表字段='过滤条件')<QuerySet [<Store: Store object>, <Store: Store object>]>Store.objects.filter(sc=category)##filter得到QuerySet,写法:filter(子表外键字段=母表主键对象),此处和一对多略有不同,是子表外键字段而不是外键字段_母表主键<QuerySet [<Store: Store object>, <Store: Store object>]>

3.删

让指定商家清空分类s = Store.objects.get(s_name="商家C")c = Category.objects.all()s.sc = ""s.save()s=Store.objects.get(s_name="商家C")c = Category.objects.all()s.sc.remove(*c)s = Store.objects.get(s_name="商家C")s.sc.clear()删除母表与子表关联关系让所有商家去掉指定分类s = Store.objects.all()c = Category.objects.get(c_name="电脑整机")c.store_set.remove(*s)c = Category.objects.get(c_name="电脑整机")c.store_set.clear()#删除商家子表数据删除所有指定分类的全部商家c=Category.objects.get(c_name="电脑整机")c.store_set.all().delete()删除所有商家Store.objects.all().delete()
原创粉丝点击