【问题标题】:Reverse relations with django-gm2m using "through" relation使用“通过”关系与 django-gm2m 反向关系
【发布时间】:2023-03-09 15:32:01
【问题描述】:

我不明白如何使用 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 进行反向查找以查看它的使用位置?

【问题讨论】:

  • this 没有帮助吗?

标签: python django m2m


【解决方案1】:

如上所述,in the documentation django-gm2m 只能在您将实例添加到 *_set 后创建相关的反向关系(就像您对 X 对象所做的那样),因为它不知道在哪些模型上需要反向关系。

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

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

这在某种程度上类似于 Django 的行为,您还必须为 GenericForeignKey manually 创建反向关系。

【讨论】:

  • "...在您将实例添加到 *_set 之后":那我该怎么做呢?我做不到y1.things.add(a1)。这会产生一个 AttributeError 并告诉我改用 Yrel 的经理。我的问题中的命令是我认为应该如何完成的。
  • 如果您想使用这样的直通模型,完全可以这样做,但只需让GM2MField 知道它应该创建哪些模型(AB)反向关系,就像我发布的示例一样......
  • 谢谢,但是从文档和您编写的内容来看,似乎还有另一种方法,我不必显式创建这些关系,但它们是在对象第一次获取时创建的这样的关系。如果确实有这样的替代方案,我仍然不明白这是怎么做到的。
  • 只有在通过add() 方法添加某些内容时才会自动创建,但这不是持久的,例如。仅当添加发生在同一请求中时才会存在...
  • 所以我再次感觉到有其他方法可以做到这一点,我使用add 方法。我还是想知道怎么做。如果答案是我在使用 through 时无法做到这一点,但我需要明确说明我正在使用哪些模型,我可以理解,但我听到的是有一种方法可以做这个。我还应该说这个问题是由对 [this question] (stackoverflow.com/questions/29353833/…) 的回答提示的,其中给出了一个类似于我的示例,但没有明确指定模型。)
猜你喜欢
  • 2017-05-31
  • 2011-12-27
  • 2011-03-23
  • 2014-05-27
  • 2018-07-05
  • 2016-05-07
  • 2019-11-06
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多