多对多关系 ManyToManyField
以下是一些小说和小说标签,以及小说和标签之间的多对多关系
宫锁心玉 => 穿越、古装、言情
美女总裁 => 都市、言情
斗破苍穹 => 穿越、玄幻、言情
都市重生 => 都市、玄幻
创建模型类Fictions、Labels,小说类和小说标签类
模型类
from django.db import models # 小说类 class Fictions(models.Model): fname = models.CharField(max_length=30) class Meta(): db_table = 'fictions' # 标签类 class Labels(models.Model): lname = models.CharField(max_length=30) # 在标签表中关联小说表,小说表的一条数据关联标签表的多条数据,标签类的一条数据关联小说表的多条数据 # django会自动生成第三个表(该表描述了小说和标签的关系) fid = models.ManyToManyField(to='Fictions') class Meta(): db_table = 'labels'
根路由
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('app/', include('myapp.urls')), ]
子路由
from django.urls import path, re_path from . import views urlpatterns = [ path('mtm_add/', views.manytomany_add), path('mtm_search/', views.manytomany_search), path('mtm_update/', views.manytomany_update), path('mtm_delete/', views.manytomany_delete), ]
视图
from django.http import HttpResponse from . import models # =========================模型多对多关系====================================== def manytomany_add(request): # 添加小说 fiction_01 = models.Fictions(fname='宫锁心玉/') fiction_02 = models.Fictions(fname='美女总裁/') fiction_03 = models.Fictions(fname='斗破苍穹/') fiction_04 = models.Fictions(fname='都市重生/') fiction_01.save() fiction_02.save() fiction_03.save() fiction_04.save() # 添加标签 label_01 = models.Labels(lname='穿越/') label_02 = models.Labels(lname='古装/') label_03 = models.Labels(lname='言情/') label_04 = models.Labels(lname='都市/') label_05 = models.Labels(lname='玄幻/') label_01.save() label_02.save() label_03.save() label_04.save() label_05.save() # 将小说和标签关联起来 fictions = models.Fictions.objects.filter(id__gte=0) label = models.Labels.objects.filter(id__gte=0) label[0].fid.add(fictions[0], fictions[2]) label[1].fid.add(fictions[0]) label[2].fid.add(fictions[0], fictions[1], fictions[2]) label[3].fid.add(fictions[1], fictions[3]) label[4].fid.add(fictions[2], fictions[3]) return HttpResponse('<script>alert("success");</script>') def manytomany_search(request): # 通过小说查标签 fiction = models.Fictions.objects.get(id=1) print(fiction.fname) print(fiction.labels_set.all().values()) # 通过标签查小说 label = models.Labels.objects.get(id=2) print(label.lname) print(label.fid.all().values()) return HttpResponse('<script>alert("success");</script>') def manytomany_update(request): # 修改小说名称并通过小说对象修改标签 fiction = models.Fictions.objects.get(id=1) fiction.fname = '宫锁心玉' fiction.save() update_label = fiction.labels_set.all().first() update_label.lname = '穿越' update_label.save() # 修改标签名称并通过标签对象修改小说 label = models.Labels.objects.get(id=3) label.lname = '言情' label.save() update_fiction = label.fid.all().last() update_fiction.fname = '斗破苍穹' update_fiction.save() return HttpResponse('<script>alert("success");</script>') def manytomany_delete(request): # 删除小说表的数据,标签表不会产生影响,但会删除掉关系表中与该数据有关的记录 # delete_fiction = models.Fictions.objects.get(id=4) # delete_fiction.delete() # 删除标签表的数据,小说表不会产生影响,但会删除掉关系表中与该数据有关的记录 delete_label = models.Labels.objects.get(id=5) delete_label.delete() return HttpResponse('<script>alert("success");</script>')
我们无需自己创建关系表,Django会自动生成第三个关系表(该表描述了小说和标签的关系)