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)
    #设置多对多关联 FK
    movies=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 render

from 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()
    # 添加mc
    mc = 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-2
    customer.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 = [

    #manytomany
    path('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) 跨表获取数据:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H3C ER G2系列路由器信息泄露漏洞

H3C ER G2系列路由器信息泄露漏洞 免责声明漏洞描述漏洞影响漏洞危害漏洞页面漏洞复现1. 构造poc2. 发生数据包&#xff0c;获取密码3. 登录系统 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地提高网络安全意识和技术水平。 任何人不得利用该文章…

详解—【C++】lambda表达式

目录 前言 一、lambda表达式 二、lambda表达式语法 2.1. lambda表达式各部分说明 2.2. 捕获列表说明 三、函数对象与lambda表达式 前言 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。 #include <algorithm> #i…

Java EE 多线程之多线程案例

文章目录 1. 多线程案例1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式1.1.3 多线程下的单例模式 1.2 阻塞队列1.2.1 阻塞队列定义1.2.2 生产者消费者模型的意义1.2.4 标准库中的阻塞队列1.2.5 实现阻塞队列1.2.6 用阻塞队列实现生产者消费者模型 1.3 实现定时器1.3.1 标准库中的定…

V2X在做什么?连接未来智能出行的车联网(上)

来源&#xff1a;德思特测试测量 德思特分享丨V2X在做什么&#xff1f;连接未来智能出行的车联网&#xff08;上&#xff09; 原文链接&#xff1a;德思特分享 | V2X在做什么&#xff1f;连接未来智能出行的车联网&#xff08;上&#xff09; 欢迎关注虹科&#xff0c;为您提…

美易官方:零售销售数据提振信心

美易全球投资中心副总裁Kenny Jolin表示全球股市在经历了动荡之后逐渐恢复了稳定。最近&#xff0c;美国股市表现强劲&#xff0c;连续六天上涨&#xff0c;道琼斯指数也创下了新高。这一趋势不仅反映了投资者信心的恢复&#xff0c;也表明了全球经济正在逐渐复苏。 他说&#…

如何在Centos 7环境下安装MySQL并登录

目录 先获取MySQL官方yum源 然后正常使用yum命令下载mysql即可完成MySQL的下载 使用mysql客户端登录mysqld服务端 能够登录mysql客户端后&#xff0c;我们最后还需要做一点配置 先获取MySQL官方yum源&#xff08;包括对yum源的介绍&#xff09; 介绍一下yum源 yum源就是一…

文献管理器Zotero使用WebDAV结合内网穿透实现公网环境跨平台同步文献笔记

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献&#xff0c;不但免费&#xff0c;功能还很强大实用。 ​ Zotero 支…

net实践记录

文章目录 前言是否使用继承快捷输入 实体&#xff1b;引用class&#xff0c;提示有保护性System.NullReferenceException:“未将对象引用设置到对象的实例。” 总结 前言 记录使用.net 项目开发过程基础问题记录&#xff0c;便于快速回顾与查询&#xff1b; 是否使用继承 快捷…

关于git clone速度极慢的解决方法

&#xff01;&#xff01;&#xff01;&#xff01;前提条件&#xff1a;得有一个可靠且稳定的梯子&#xff0c;如果没有接下来的就不用看了 前言&#xff1a;我在写这篇文章前&#xff0c;也搜索过很多相关git clone速度很慢的解决方法&#xff0c;但是很多很麻烦&#xff0c…

Maven环境搭建及配置

Maven环境搭建及配置 1.下载部署 官方网站下载正式版的Maven文件,打开bin目录&#xff0c;复制路径然后去环境变量中的path下配置环境变量&#xff0c; 如果只有一个用户只需要在上面path配置复制的路径,当然也可以直接在下面配置,下面配置默认给所有用户都配置 设置完成打开控…

垃圾收集器及内存分配

目录 垃圾收集器种类 HotSpot虚拟机所包含的收集器 垃圾收集器部分源码 垃圾收集器后台日志参数说明与配对关系 1、串行垃圾收集器 串行垃圾收集器运行示意图 1&#xff09;、编写测试代码 2&#xff09;、设置垃圾回收为串行收集器 3&#xff09;、启动程序&#xff…

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上&#xff0c;运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中&#xff0c;遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

超详细 | 哈里斯鹰优化算法原理、实现及其改进与利用(Matlab/Python)

测试函数为F9 在MATLAB中执行程序结果如下&#xff1a; 在Python中执行程序结果如下&#xff1a; 哈里斯鹰优化算法(Harris Hawks Optimization , HHO)是 Heidari等[1]于2019年提出的一种新型元启发式算法&#xff0c;设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突…

基础算法(3):排序(3)插入排序

1.插入排序实现 插入排序的工作原理是&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已经排序的序列从后向前扫描&#xff0c;找到位置并插入&#xff0c;类似于平时打扑克牌时&#xff0c;将牌从大到小排列&#xff0c;每次摸到一张牌就插入到正确的位…

香港威雅报告:香港威雅学校入选英国《优秀学校指南》

今天&#xff0c;我们很荣幸地和大家分享一个特别的消息——香港威雅已接受了英国领先的学校审查机构——《优秀学校指南》&#xff08;The Good Schools Guide&#xff09;的全面评审。这是一家值得信赖的权威评审机构&#xff0c;相关工作人员来访并审查了我们的学校&#xf…

【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 微服务](…

网络互通--三层交换机配置

目录 一、三层交换机的原理 1、概念 2、PC A与不同网段的PC B第一次数据转发过程 3、一次路由&#xff0c;多次转发的概念 4、 三层交换机和路由器的比较 二、利用实验理解交换机 1、建立以下拓扑图​编辑 2、分别配置主机的IP地址&#xff0c;子网掩码、网关等信息 3、…

2DPASS激光雷达点云语义分割简介

导读 香港中文大学深圳深度比特实验室提出了一种基于二维图像先验辅助的激光雷达点云语义分割 (2DPASS)。不同于先前的多模态方法&#xff08;训练和推理阶段均需要成对的图像和点云数据作为输入&#xff09;&#xff0c;该方法仅在训练阶段利用额外的图像数据&#xff0c;从相…

如何关闭微信视频号的详细步骤

随着移动互联网的发展&#xff0c;越来越多的人开始使用各种社交平台来分享自己的生活和工作。而微信作为一款全民级别的应用&#xff0c;自然也不例外。在微信中&#xff0c;除了传统的聊天、朋友圈等功能外&#xff0c;还推出了一个名为“视频号”的功能&#xff0c;可以让用…

54 代码审计-TP5框架审计写法分析及代码追踪

目录 知识点1知识点2演示案例:demo代码段自写和规则写分析hsycms-TP框架-不安全写法-未过滤weipan21-TP框架-规则写法-内置过滤 知识点1 调试&#xff0c;访问&#xff0c;路由&#xff0c;配置&#xff0c;版本等 知识点2 自写写法&#xff1a;自己写代码&#xff0c;一步步…