15、 Django-多表操作-多个模块的关联-多对多的增删改查- models.manytomany()
针对多对多的关系django会自动创建第三张表、也可以通过through参数指定第三张表
models.py
from django.db import models # Create your models here. #多对多 #用户表:电影 = N:M #一个用户可以收藏多部电影 #一部电影可以被不同的用户收藏 #电影 class Movie(models.Model): name = models.CharField(max_length=100) duration = models.IntegerField(default=90) #电影时长 #用户 class User(models.Model): name = models.CharField(max_length=30) age = models.IntegerField(default=18) #定义多对多 #这里绑定上面的电影类 #这里movies 相当于是 中间表的对象 movies = models.ManyToManyField(Movie) #数据迁移 #迁移后会产生三个表: #App_ManytoMany_movie #App_ManytoMany_user #App_ManytoMany_user_movies #这个就是中间表、自动生成-拥有两张表的主键+本身的主键字段
views.py
from django.shortcuts import render, HttpResponse from App_ManytoMany.models import * #多对多 #增加数据 def add(request): # #添加User表数据 # for i in range(1, 10): # User.objects.create(name = f'张三-{i}', age = i) #添加movie表数据 # for i in range(1, 10): # Movie.objects.create(name = f'阿凡达-{i}', duration = 100+i) #添加中间表的数据 #让张三-1 去收藏阿凡达-1 user = User.objects.get(name='张三-1') #获取张三-1的信息 movie = Movie.objects.get(name='阿凡达-1') #获取阿凡达-1的信息 #添加收藏、以下方法选其一即可 # user.movies.add(movie) #用户收藏电影 -这里的movies是models中的User类里绑定多对多关系的对象 movie.user_set.add(user) #或将电影添加到用户张三-1的收藏中 -这里的user_set是默认自动创建的对象(可获取被绑定的表(中间表)的所有数据) return HttpResponse('添加成功') #删除 def delete(request): #删除User表数据 # User.objects.filter(id=9).delete() #删除Movie表数据 # Movie.objects.filter(id__gte=10).delete() #删除中间表数据 user = User.objects.get(name='张三-1') #先找出用户 user.movies.filter(name='阿凡达-1').delete() #再找出用户所对应的电影 - 这里的movies是models中的User类里绑定多对多关系的对象、可以获取中间表的所有对象值 return HttpResponse('删除成功') #查询数据 def get_user_movie(request): #获取用户收藏的电影 user = User.objects.get(id=1) #拿到id=1的用户 print(user.movies.all()) #通过movies-中间表对象.all()获取用户id=1收藏的所有的电影 #获取电影被哪些用户收藏 movie = Movie.objects.get(id=4) print(movie.user_set.all()) return HttpResponse('查询成功')
urls.py
from django.contrib import admin from django.urls import path #多对多 from App_ManytoMany import views as manytomany_view urlpatterns = [ #多对多 #增加数据路由 path('manytomany/adduser/', manytomany_view.add), # 删除数据路由 path('manytomany/deluser/', manytomany_view.delete), # 查询数据路由 path('manytomany/getuser/', manytomany_view.get_user_movie), path('admin/', admin.site.urls), ]
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18125080
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步