Django 模型操作 - 多对多(九)

一、多对多关联管理器(对象调用)

前提:多对多(双向均有关联管理器)一对多(只有多的那个类的对象有关联管理器,即反向才有)
语法格式:正向:属性名反向:小写类名加 _set注意:一对多只能反向
常用方法:add():用于多对多,把指定的模型对象添加到关联对象集(关系表)中。注意:add() 在一对多(即外键)中,只能传对象( *QuerySet数据类型)不能传 id(*[id表])。*[ ] 的使用:

二、多对多的应用(用户:电影(N:M))CRUD操作

 (1) models.py

#电影模型
class Movie(models.Model):name=models.CharField(max_length=150)duration=models.IntegerField(default=90)class Meta:db_table='movie'verbose_name='电影'verbose_name_plural=verbose_name#用户模型
class Customer(models.Model):name=models.CharField(max_length=150)age=models.IntegerField(default=18)#设置多对多关联 FKmovies=models.ManyToManyField(Movie)class Meta:db_table='customer'verbose_name='用户'verbose_name_plural=verbose_name

(2)views.py

from django.http import HttpResponse
from django.shortcuts import renderfrom manytomany.models import Customer, Movie
def addCustomer(request):# 添加10个用户for i in range(1, 11):Customer.objects.create(name=f'mike{i}', age=i)return HttpResponse('用户添加成功!')def addMovie(request):# 添加10个用户for i in range(1, 11):Movie.objects.create(name=f'流浪地球{i}', duration=100 + i)return HttpResponse('电影添加成功!')# 正向:属性
def add_c_m(request):# 方式一:传对象# 获取用户对象# customer=Customer.objects.get(id=2)# # 获取电影对象 id<5# movie_list=Movie.objects.filter(id__lt=5)# # 将 id 小于5的电影对象添加到用户集合中# customer.movies.add(*movie_list)# 方式二:传对象 id# 获取用户对象customer = Customer.objects.get(id=3)# 将 id=7 和 id=8 的电影对象添加到用户集合中customer.movies.add(*[7, 8])return HttpResponse('用户-电影添加成功!')# 反向:小写表名_set
# create():创建一个新的对象,并同时将它添加到关联对象集之中。
# 返回新创建的对象。
def add_m_c(request):# 获取电影对象movie = Movie.objects.filter(name='流浪地球5').first()# 获取用户对象customer = Customer.objects.filter().first()# 添加mcmc = movie.customer_set.add(customer)return HttpResponse('电影-用户set添加成功!')# remove():从关联对象集中移除执行的模型对象。
# 对于 ForeignKey 对象,这个方法仅在 null=True(可以为空)时存在,无返回值。
def del_c_m(request):# 获取电影对象# movie=Movie.objects.get(id=7)# # 获取用户对象# customer = Customer.objects.filter(pk=3).first()# # 移除中间表 3-7# movie.customer_set.remove(customer)# 获取用户对象customer = Customer.objects.filter(pk=2).first()# 移除中间表 2-2customer.movies.filter(name='流浪地球2').delete()return HttpResponse('电影-用户删除成功!')#查找
# 正向:属性名
def find_cm(request):# 获取用户对象customer = Customer.objects.filter(pk=2).first()#获取用户下所有的电影ll=customer.movies.all()print(customer,ll)#循环显示for m in ll:print(m.name,m.duration)return HttpResponse('用户-电影查询成功!')# 反向:小写表名_set
def find_mc(request):# 获取电影对象movie=Movie.objects.get(id=8)#获取电影下所有的用户cc=movie.customer_set.all()print(movie,cc)#循环显示for c in cc:print(c.name,c.age)return HttpResponse('电影-用户查询成功!')# 查询用户2所有电影。
# 正向:通过 属性名称__跨表的属性名称(movies__name) 跨表获取数据:
def find_cm2(request):# 获取用户对象所有的电影customer = Customer.objects.filter(movies__customer__name='mike2').values_list('movies__name')print(customer)#循环显示for m in customer:print(m)return HttpResponse('用户-电影查询成功!')# 查询流浪地球8的所有用户。
# 反向:通过 小写类名__跨表的属性名称(customer__name) 跨表获取数据:
def find_mc2(request):# 获取电影下所有的用户movie=Movie.objects.filter(name='流浪地球8').values_list('customer__name','customer__age')print(movie)#循环显示for c in movie:print(c)return HttpResponse('电影-用户查询成功!')

(3)urls.py


from manytomany.views import *   #导入视图urlpatterns = [#manytomanypath('manytomany/add',addCustomer),path('manytomany/add2',addMovie),path('manytomany/add3',add_c_m),path('manytomany/add4',add_m_c),path('manytomany/del',del_c_m),path('manytomany/find',find_cm),path('manytomany/find2',find_mc),path('manytomany/find3',find_mc2),path('manytomany/find4', find_cm2),]

(4) 运行

customer 表数据                                       movie表数据

customer_movies 中间表数据 

正向:根据传对象

正向:根据传对象id

 删除 3-7

 删除 2-2

添加5-78910 

 

查找用户2下所有的电影

(1)正向:属性名

查找电影编号8下所有的用户(2)反向:小写表名_set

查找用户mike5下所有的电影

正向:通过 属性名称__跨表的属性名称(movies__name) 跨表获取数据:

 

查询流浪地球8的所有用户
反向:通过 小写类名__跨表的属性名称(customer__name) 跨表获取数据:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/276704.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cfa一级考生复习经验分享系列(三)

从总成绩可以看出&#xff0c;位于90%水平之上&#xff0c;且置信区间全体均高于90%线。 从各科目成绩可以看出&#xff0c;所有科目均位于90%线上或高于90%线&#xff0c;其中&#xff0c;另类与衍生、公司金额、经济学、权益投资、固定收益、财报分析表现较好&#xff0c;目测…

【数学知识】LCP42: 玩具套圈

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的基础知识点 优化后&#xff0c;就不需要二分了。 二分查找算法合集 题目 「力扣挑战赛」场地外&#xff0c;小力组织了一个套玩具的游戏。所有的玩具摆在平地上&#xff0c;toys…

【Monitor, Maintenance Operation, Script code/prgramme】

Summary of M,M&O,Program JD) Monitor & M&O Symbio信必优) Job chance/opportunities on Dec 12th, 20231.1) Content 招聘JD job description:1.2) suggestions from Ms Liang/Winnie on Wechat app1.3) Java微服务是什么&#xff1f;1.3.1) [URL Java 微服务](…

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

2023,真人漫改走上IP高地

你能接受自己的纸片人老公/老婆变成了真人吗&#xff1f; 无论大家能不能接受&#xff0c;真人漫改都已经成为了影视行业的新趋势&#xff0c;而阅文集团收购腾讯动漫的举措&#xff0c;无疑是为漫改剧添了一把火。 在阅文宣布以6亿人民币的价格收购腾讯动漫旗下的相关业务以…

Python:如何解决MODIS GRID(正弦投影/GCTP_SNSOID)的重投影问题?

博客已同步微信公众号&#xff1a;GIS茄子&#xff1b;若博客出现纰漏或有更多问题交流欢迎关注GIS茄子&#xff0c;或者邮箱联系(推荐-见主页). 01 投影参数了解 这里我将用手上存有的MCD12Q1&#xff08;土地利用数据集&#xff09;和MOD11A2&#xff08;地表温度数据集&…

nginx 网页匹配跳转

常用的Nginx 正则表达式 常用的Nginx 正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“o…

租一台服务器多少钱决定服务器的价格因素有哪些

租一台服务器多少钱决定服务器的价格因素有哪些 大家好我是艾西&#xff0c;服务器这个名词对于不从业网络行业的人们看说肯定还是比较陌生的。在21世纪这个时代发展迅速的年代服务器在现实生活中是不可缺少的一环&#xff0c;平时大家上网浏览自己想要查询的信息等都是需要服…

C++类和对象(3)

目录 再谈构造函数 构造函数体赋值 初始化列表 【注意】 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 概念 特性&#xff1a; 匿名对象 拷贝对象时的一些编译器优化 再谈构造函数 构造函数体赋值 在创建对象时&#xff0c;编译…

【华为数据之道学习笔记】3-11元数据管理

1. 产生元数据 &#xff08;1&#xff09;明确业务元数据、技术元数据和操作元数据之间的关系&#xff0c;定义华为公司元数据模型。 &#xff08;2&#xff09;针对找数据及获取数据难的痛点&#xff0c;明确业务元数据、技术元数据、操作元数据的设计原则。 1&#xff09;业务…

燃气发电机组市场分析:预计2029年将达到682亿元

燃气发电机组是一种以液化气、天然气等可燃气体为燃烧物&#xff0c;代替汽油、柴油作为发动机动力的新型&#xff0c;高效的新能源发电机组。 燃气发电机组根据燃烧气体的不同可以分为&#xff1a;天然气发电机组、石油伴生气发电机组、发生炉煤气发电机组、液化石油气发电机组…

伦敦金投资者的本质其实是风险管理者

长期在市场中可以稳定盈利的投资者&#xff0c;他们的秘密是什么&#xff1f;很多人以为&#xff0c;肯定是他有别人所没有的交易策略。其实并不是&#xff0c;交易技术固然很重要&#xff0c;但在持续盈利的问题上&#xff0c;技术所占的重要性是次要的&#xff0c;而主要的是…