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

  • 相关阅读:
    hdu_5961_传递(bitset)
    hdu_5963_朋友(找规律)
    hdu_5968_异或密码(预处理+二分)
    hdu_5969_最大的位或(贪心)
    hdu_5965_扫雷(递推)
    hdu_5950_Recursive sequence(矩阵快速幂)
    hdu_5286_wyh2000 and sequence(分块)
    [BZOJ1951][SDOI2005]古代猪文(数论好题)
    [BZOJ2659][WC2012]算不出的算式(几何)
    [BZOJ 2656][ZJOI2012]数列(递归+高精度)
  • 原文地址:https://www.cnblogs.com/glz666/p/13762649.html
Copyright © 2020-2023  润新知