Django之多对多操作

多对多三种方式

from django.db import models

# Create your models here.

# 多对多之纯自定以表
# class A(models.Model):
#     a_filed = models.CharField(max_length=32)
#
# class B(models.Model):
#     b_filed = models.CharField(max_length=32)
#
#
# class Relation_AB(models.Model):
#     a = models.ForeignKey("A")
#     b = models.ForeignKey
#     # 如果需要创建联合唯一索引则添加以下內容
#     class Meta:
#         unique_together = [
#             ('a','b')
#         ]

# 多对多之使用ManyToManyField,字段在任一张表,此字段有局限性,只能三个字段
# class A(models.Model):
#     a_filed = models.CharField(max_length=32)
#     ab = models.ManyToManyField("B") # 会生成关系表“app01_a_ab”
#
# class B(models.Model):
#     b_filed = models.CharField(max_length=32)

# 多对多之对自定义与M2M联合使用,可以对关系表添加其它字段
class A(models.Model):
    a_filed = models.CharField(max_length=32)
    ab = models.ManyToManyField("B",through="Relation_AB",through_fields=('a','b'))

class B(models.Model):
    b_filed = models.CharField(max_length=32)


class Relation_AB(models.Model):
    a = models.ForeignKey("A")
    b = models.ForeignKey("B")
    # 如果需要创建联合唯一索引则添加以下內容
    class Meta:
        unique_together = [
            ('a','b')
        ]

三种方式的相关操作

from django.shortcuts import render,HttpResponse
from app01 import models
# Create your views here.

def mtom(request):
    # A 表生成数据
    # a = [
    #     models.A(1,"盖聂"),
    #     models.A(2,"卫庄"),
    #     models.A(3,"高渐离"),
    #     models.A(4,"白凤"),
    #      ]
    # models.A.objects.bulk_create(a)

    # B 表生成数据
    # b = [
    #     models.B(1,"端木蓉"),
    #     models.B(2,"红莲"),
    #     models.B(3,"雪女"),
    #     models.B(4,"弄玉"),
    # ]
    # models.B.objects.bulk_create(b)

    # 关系表建立关系
    # for i in range(1,5):
    #     models.Relation_AB.objects.create(a_id=i,b_id=i)

    # 查询"盖聂"相关的人 -- 通过"盖聂"所在的表查询
    # obj = models.A.objects.filter(a_filed="盖聂").all()
    # print(obj,obj[0]) # --> <QuerySet [<A: A object>]> A object
    # obj = models.A.objects.filter(a_filed="盖聂").first()
    # print(obj) # -->A object
    # # 对象才有表名_set方法,QuerySet对象没有
    # res = obj.relation_ab_set.all()
    # for i in res:
    #     print(i.b.b_filed)

    # 查询"盖聂"相关的人 -- 通过关系表表查询
    # obj = models.Relation_AB.objects.filter(a__a_filed='盖聂').first()
    # print(obj.b.b_filed)

    # 查询"盖聂"相关的人 -- 通过关系表查询2
    # obj = models.Relation_AB.objects.filter(a__a_filed='盖聂').values("b__b_filed")
    # print(obj)

    # 查询"盖聂"相关的人 -- 通过关系表查询3
    # obj = models.Relation_AB.objects.filter(a__a_filed='盖聂').select_related("b")
    # for i in obj:
    #     print(i.b.b_filed)

    # ManyToManyField用法
    # 建立关系,插入数据
    # obj = models.A.objects.filter(id=1).first()
    # obj.ab.add(1)  # insert into app01_a_ab(a_id,b_id) values(1,1)
    # obj.ab.add(2,3,4) # insert into app01_a_ab(a_id,b_id) values(1,2),(1,3),(1,4)

    # 修改关系,删除数据
    # obj = models.A.objects.filter(id=1).first()
    # # obj.ab.remove(1) # delete from app01_a_ab where b_id=1
    # obj.ab.remove(2,3,4) # delete from app01_a_ab where b_id in (2,3,4)

    # 修改数据,替换
    # obj = models.A.objects.filter(id=1).first()
    # obj.ab.set([2,3]) # 关系表中原有的数据会清空,新增insert into app01_a_ab(a_id,b_id) values(1,2),(1,3)

    # all方法拿到的对象 -- m2m在a表,拿到b表对象(与a表查询的对象相关的b表对象)
    # obj = models.A.objects.first()
    # print(obj.ab.all())

    # 反向查询,m2m字段在a表,通过b表查a表数据
    # obj = models.B.objects.filter(id=2).first()
    # print(obj.id,obj.b_filed)
    # print(obj.a_set.values())

    return HttpResponse("ojbk")

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值