针对多对多的关系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 去收藏阿凡达-1user = 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),
]