django, contenttype и m2m родовые отношения - PullRequest
0 голосов
/ 19 января 2012

У меня есть следующие модели:

  1. Заявка
    1. Контактная форма
    2. Игра
    3. Landing Page
  2. Клиент

После добавления нового Клиента я хочу добавить новые приложения под клиентом.Для этого я добавил поле m2m в разделе «Клиенты для приложений» следующим образом:

applications = models.ManyToManyField(Application, verbose_name=u'Applications')

Поскольку приложение может быть чем угодно, я обнаружил, что мне нужно использовать фреймворк Contenttype.Поэтому я поместил в модель приложения следующее:

applicationContentType = models.ForeignKey(ContentType)
applicationId = models.PositiveIntegerField()
application = generic.GenericForeignKey('applicationContentType', 'applicationId')

Таким образом, я могу добавить новые приложения, выбрав тип контента (в данном случае форму контента) и введя идентификатор существующей контактной формы.И я могу видеть это в поле m2m Клиента на странице администратора.

Однако, когда я делаю следующее, я не вижу приложение, которое я только что добавил к Клиенту:

In [2]: t = Client.objects.get()
In [3]: t.applications.all()
Out[3]: []

Ивспоминать недавно добавленный идентификатор контактной формы не очень приятно.Есть ли элегантное решение этого?Или я должен изменить свою точку зрения на проблему и сделать это по-другому?

1 Ответ

0 голосов
/ 15 февраля 2014

Примечание: я знаю, что это очень старый вопрос, но подумал, что кто-то может выиграть это

То, что вы описываете, будет работать идеально, если каждая из моделей приложения (или их abstract родитель ) будет иметь ключ m2m к клиенту.Я не рекомендовал бы использовать универсальные внешние ключи, если это не является абсолютно неизбежным (поверьте мне, вы будете благодарить меня позже).

Например, возьмите модель приложения:

class Application(models.Model):
    class Meta:
        abstract = True

    field1 = ...
    field2 = ...

    client = models.ManyToManyField('clients.Client',
                                    related_name="related_%(class)s")

Используя этот подходобратные поля будут доступны для клиента через related_games, related_contactforms и related_landingpages соответственно.

...