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

posted @ 2024-07-09 22:31  little小新  阅读(25)  评论(0编辑  收藏  举报