多对多三种方式
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")