使用版本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,全部改成all
store.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()

Django中多对多查询方式相关推荐

  1. 达梦中的连接查询方式

    达梦中的连接查询方式,全部参照官方文档. 查询语句中FROM子句包含多个表时,称为连接查询.生成连接查询的执行计划,需要考虑三方面因素:访问路径.连接方式.连接顺序. 访问路径指对于每张表采用何种方式 ...

  2. Hibernate中的QBC查询方式详解

    Hibernate中的QBC查询方式详解 QBC:Query By Criteria,条件查询. 是一种更加面向对象化的查询的方式. 1.QBC简单查询 测试代码: package com.pipi. ...

  3. 今天想到了关于 Django 中 view 的组织方式问题

    之前一直做 ASP.NET, 对于一个页面文件一个 view 的做法感觉很好.而 django 中在一个文件里很多个函数,每一个代表一个 view. 这样的做法在网站程序复杂化后,查找代码很不方便.当 ...

  4. ElasticSearch(ES)中的分片查询方式

    原文地址:http://www.bubuko.com/infodetail-836737.html Es查询的时候默认是随机从一些分片中查询数据,可以通过配置让es从某些分片中查询数据 1:_loca ...

  5. 在django中按照时间范围查询数据库

    2019独角兽企业重金招聘Python工程师标准>>> 介绍一个简单的功能,就是从web表单里获取用户指定的时间范围,然后在数据库中查询此时间范围内的数据.         数据库里 ...

  6. django中的关联查询

    通过模型类实现关联查询 例:查询图书信息,要求图书关联的英雄的描述包含'盲'. >>> BookInfo.objects.filter(heroinfo__hname__contai ...

  7. django中的Q查询

    转载于:https://mozillazg.com/2015/11/django-the-power-of-q-objects-and-how-to-use-q-object.html 原文写的很详细 ...

  8. web.py中实现类似Django中的ORM的查询效果

    Django中的对象查询 Django框架自带了ORM,实现了一些比较强大而且方便的查询功能,这些功能和表无关.比如下面这个例子: class Question(models.Model):quest ...

  9. 如何在Django中以GROUP BY查询?

    本文翻译自:How to query as GROUP BY in django? I query a model: 我查询一个模型: Members.objects.all() And it ret ...

最新文章

  1. mysql skip network_MYSQL-skip-networking
  2. iOS架构-cocoaPods之自制私有库及管理(17)
  3. 三维空间长度温度数量_塑料压力和温度对注塑件质量与尺寸的影响研究
  4. 转:MFC 的程序中GetAt()的理解
  5. rz安装 xshell_利用XShell上传、下载文件(使用sz与rz命令)
  6. IPsec ***数据传输过程
  7. python使用t-sne算法降维,方便可视化
  8. 杯水车薪!昔日手机巨头今拍卖外观设计专利抵债 起拍价仅2.11万元
  9. java之IO整理(下)
  10. 实用的 Python —— os.system() 在 python 语句中执行 dos 命令
  11. JAVA输入jdb,解决 JAVA 单步调试键盘输入被 JDB 占用的问题
  12. ASCII码查询及简单说明
  13. VMware ESXi客户端连接控制台时提示VMRC控制台连接已断开...正在尝试重新连接的解决方法...
  14. 移动周刊第 176 期:Android 知识梳理
  15. Linux命令如何将竖行改成横行,用DECODE和CASE WHEN将多行单列数据改为单行多列数据(即竖向排列改为横向排列)...
  16. [vue] 主题设置
  17. 当你觉得生活快熬不下去时,请你读一读《活着》
  18. Linux 磁盘分区及文件系统挂载
  19. 浙江大学PAT_甲级_1032. Sharing (25)
  20. 用Bootstrap写一份简历

热门文章

  1. 软考中级哪个证最好考?
  2. ps cs6移除html,ps cs6清除照片中不想要的杂物教程
  3. 智能语音计算器(二)
  4. 腾讯会议:资源加载失败请重新安装程序解决方案
  5. 洛谷:P1042 [NOIP2003 普及组] 乒乓球 C++详解
  6. #2021暑假杭电多校8_1003.Ink on paper
  7. [HDF5] 封装了一个简单的C++ HDF5工具库,实现常用数据类型的读写
  8. 编程都该学什么语言?几个流行编程语言对比
  9. 最新韩小韩二次元高清图库api开源PHP网站源码
  10. python合并音频Couldn‘t find ffprobe or avprobe解决办法