Обратные отношения с django-gm2m, используя сквозное отношение - PullRequest
0 голосов
/ 19 февраля 2019

Я не понимаю, как следовать отношениям «многие ко многим» в обратном направлении с 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 оба имеют «вещи», которые содержат несколько произвольных объектов.У меня проблемы с, а X только для сравнения.

У меня есть несколько объектов для тестирования.

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

и т. Д.С классом XI можно сделать

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 голосов
/ 19 февраля 2019

Как описано в документации django-gm2m может создавать связанные обратные отношения только после добавления экземпляра в *_set (как вы это делали с объектами X), так как это можетНе знаю, для каких моделей требуется обратное отношение.

Если вы хотите получить доступ к обратным отношениям, не добавляя что-либо, прежде чем вам нужно указать, по каким моделям они должны быть созданы :

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

Это как-то напоминает поведение Джанго, когда вам также придется создать обратную связь для GenericForeignKey вручную .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...