Как я могу установить Django GenericForeignKey, указывающий на несколько классов на ManyToManyField? - PullRequest
0 голосов
/ 26 августа 2018

Все еще новичок, я должен адаптировать сценарий Django (v1.10).Оригинальный сценарий использует «инициативу» основного класса, которая может иметь любое количество «сторонников».

Адаптации, которые я должен сделать, включают в себя наличие другого основного класса, называемого «политика» и «инициатива» (аналогичное поведение, различные области).Я застрял с ManyToManyField на «инициативе» и «политике», которые должны указывать на Сторонников, где я пытаюсь использовать GenericRelation для поддержки обоих основных классов.Я получаю следующее сообщение об ошибке:

initproc.Supporter: (fields.E336) The model is used as an intermediate model by 'initproc.Initiative.supporters', but it does not have a foreign key to 'Initiative' or 'User'.
initproc.Supporter: (fields.E336) The model is used as an intermediate model by 'initproc.Policy.supporters', but it does not have a foreign key to 'Policy' or 'User'.

Мой models.py (все удалено несущественно) ДО:

# ------------------------------ Initiative ------------------------------------
class Initiative(models.Model):

  supporters = models.ManyToManyField(User, through="Supporter")


# ------------------------------- Supporter -------------.----------------------
class Supporter(models.Model):

  class Meta:
    unique_together = (("user", "initiative"),)

  user = models.ForeignKey(User)
  initiative = models.ForeignKey(Initiative, related_name="supporting")

и ПОСЛЕ моих изменений:

# ------------------------------- Supporter ------------------------------------
class Supporter(models.Model):

  class Meta:
    unique_together = (("user", "target_type", "target_id"),)

  user = models.ForeignKey(User)

  target_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  target_id = models.IntegerField()
  target = GenericForeignKey('target_type', 'target_id')

# -------------------------------- Policy --------------------------------------
class Policy(PolicyBase):

  supporters = models.ManyToManyField(User, through="Supporter")

# ------------------------------ Initiative ------------------------------------
class Initiative(models.Model):

  supporters = models.ManyToManyField(User, through="Supporter")

который выбрасывает вышеуказанную ошибку.Я думаю, я понимаю, что проблема не в ключе ForeignKey для пользователя (не изменилась), а в моей попытке заставить Supporter работать как для Initiative, так и для Policy.Я мог только найти through_fields в поисках исправления, но я думаю, что я также смотрю в неправильном месте.

Вопрос:
Как я могу установить GenericForeignKey, указывающий на несколько классов на ManyToManyField?Я также хотел бы знать, куда мне теперь поместить параметр related_name.

...