我有两个 Django 模型类:
class A(models.Model):
name = models.CharField(max_length = 128) #irrelevant
class B(models.Model):
a = models.ManyToManyField(A)
name = models.CharField(max_length = 128) #irrelevant
我想做的是:
a1 = A()
a2 = A()
b = B()
b.a.add(a1)
b.a.add(a1) #I want to have a1 twice
b.a.add(a2)
assert len(b.a.all()) == 3 #this fails; the length of all() is 2
我猜测 add() 使用了一组语义,但我怎样才能规避它呢?我尝试研究自定义管理器,但我不确定这是否正确(看起来很复杂)...
提前致谢!
我认为你想要的是使用中介模型来形成 M2M 关系through
ManyToManyField 中的关键字参数。有点像上面的第一个答案,但更“Django-y”。
class A(models.Model):
name = models.CharField(max_length=200)
class B(models.Model):
a = models.ManyToManyField(A, through='C')
...
class C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
当使用through
关键字,通常的 M2M 操作方法不再可用(这意味着add
, create
, remove
,或赋值给=
操作员)。相反,您必须创建中介模型本身,如下所示:
>>> C.objects.create(a=a1, b=b)
但是,您仍然可以对包含以下内容的模型使用常用的查询操作:ManyToManyField
。换句话说,以下内容仍然有效:
>>> b.a.filter(a=a1)
但也许更好的例子是这样的:
>>> B.objects.filter(a__name='Test')
只要中间模型上的 FK 字段没有指定为unique
您将能够使用相同的 FK 创建多个实例。您还可以通过添加您喜欢的任何其他字段来附加有关关系的其他信息C
.
中介模型已记录here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)