• Django模型多对多关系


    多对多关系 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会自动生成第三个关系表(该表描述了小说和标签的关系)

  • 相关阅读:
    一、编程语言
    1、计算机基础
    四、格式化输出与基本运算符
    二、变量及用户与程序互交
    三、基本数据类型
    查看静态库中有哪些函数
    vs2010 error MSB6006: “cmd.exe”已退出,代码为 1
    ffmpeg formats
    C#启动一个外部程序(3)CreateProcess
    C#启动一个外部程序(2)ShellExecute
  • 原文地址:https://www.cnblogs.com/glz666/p/13762649.html
Copyright © 2020-2023  润新知