django 外键多对多

例子:

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 则以上查询为非关联数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值