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),
]