使用“直通”关系与django-gm2m反向关系

时间:2019-02-19 14:29:04

标签: python django m2m

我不明白如何使用django-gm2m沿反方向进行多对多关系。这是models.py的示例:

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
from gm2m import GM2MField

class A(models.Model):
    pass

class B(models.Model):
    pass

class X(models.Model):
    things = GM2MField()

class Y(models.Model):
    things = GM2MField(through='Yrel')

class Yrel(models.Model):
    y = models.ForeignKey(Y)
    thing = GenericForeignKey(ct_field='thing_ct', fk_field='thing_fk')
    thing_ct = models.ForeignKey(ContentType)
    thing_fk = models.CharField(max_length=255)
    timestamp = models.DateTimeField(auto_now_add=True)

X和Y都具有“事物”,其中包含多个任意对象。是我遇到问题的Y,而X仅用于比较。

我有一些要测试的对象。

a1, a2, b1 = A(), A(), B()
a1.save()
a2.save()
b1.save()

等有了X班,我可以做

x1, x2 = X(), X()
x1.save()
x2.save()
x1.things.add(a1, b1)
x2.things.add(a1)

,然后用x1.things.all()等返回添加的内容。要反向执行,请像在x_set中一样使用a1.x_set.count()

到目前为止,一切都很好。对于使用“通过”的“ Y”,我这样做

y1 = Y()
y1.save()
Yrel(y=y1, thing=a1).save()
Yrel(y=y1, thing=a2).save()

添加两个“事物”,然后我可以再次使用y1.things.all()重新获得列表。但是如何从a1进行反向查找以查看其使用位置?

1 个答案:

答案 0 :(得分:0)

in the documentation所述,django-gm2m只能在将实例添加到 def receive: Receive { case msg: InsertDataInMongo => mongoActor.forward(msg) case msg: InsertDataInES => esActor.forward(msg) } 后(与对*_set对象所做的一样)创建相关的反向关系。不知道在哪个模型上需要反向关系。

如果您想在没有添加任何内容之前访问反向关系,则需要specify on which models they should get created

X

这在某种程度上类似于Django的行为,您还必须为class Y(models.Model): things = GM2MField(through='Yrel', A, B) manually创建反向关系。

相关问题