例子:
class Information(BaseModel):
name = models.CharField(max_length=50, verbose_name="名称")
class Detail(BaseModel):
name = models.TextField(verbose_name="")
pid = models.ManyToManyField(
Information,
through="Relation", # 指定关联表,可以没有 会自动生成关联表
default=0,
verbose_name="父id",
related_name="detail" # 通过Information 查询Detail 时候使用, obj.detail
)
# 自定义关联表
class Relation(BaseModel):
# 关联Information, on_delete=DO_NOTHING 表示删除关系不删除原数据
info = models.ForeignKey(Information, on_delete=DO_NOTHING)
detail = models.ForeignKey(Detail, on_delete=DO_NOTHING)
class Meta:
unique_together = ('info', 'detail') # 多对多增加唯一索引
增加一条关联
info = Information.objects.filter(pk=1).first()
detail = Detail.objects.filter(pk=1).first()
info.detail.add(detail) or info.detail.add(detail.pk)
或者
detail.pid.add(info) or detail.pid.add(info.pk)
增加多条关联
into_ids = [1,2,3,4]
info.detail.add(*into_ids)
删除一条关联
info.detail.remove(detail)
删除多条
info.detail.clear()
查询关联数据
detail = Detail.objects.filter(pid=info).all()
如果info= None 则以上查询为非关联数据