Django: существует ли способ иметь “через” модель в ManyToManyField в другом приложении к модели, содержащей ManyToManyField?

Позволяет говорят, что у меня есть два django приложения:

  • соревнования - который обработает данные конкуренции
  • записи - который обработает функциональность, касающуюся ввода конкурентов в соревнования

В приложении соревнований у меня есть модель, которая представляет раздел конкуренции:

class Division(models.Model):
    competition = models.ForeignKey(Competition)
    discipline = models.CharField(max_length=1, choices=DISCIPLINE_CHOICES)
    age_group = models.ForeignKey(AgeGroup)
    participants = models.ManyToManyField(Competitor, through='Entry')

Я хочу поместить модель Entry в приложение записей:

class Entry(models.Model):
    division = models.ForeignKey('Division')
    competitor = models.ForeignKey(Competitor)
    withdrawn = models.BooleanField(default=False)

Как я решаю от... импорта... операторы, так, чтобы они работали? Когда я вставил операторов импорта такой как from entries.models import Entry Я получаю модели из этих приложений, проигнорированных syncdb (потому что импорт является круговым), или когда я удаляю один или они оба, которые я получаю ошибки проверки:

Ошибка: Одна или несколько моделей не проверили: entries.entry: 'подразделение' имеет отношение с моделью Division, которая не была или установлена или абстрактна. competitions.division: 'участники' указывают m2m отношение через модель Entry, которая не была установлена

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

8
задан Bjorn 27 January 2010 в 14:24
поделиться

2 ответа

Кажется, я нашел ответ, который работает более последовательно :)

В документации Django по классу ForeignKey говорится:

Ссылаться на модели, определенные в другой приложение, вы можете явно указать модель с полным прикладная этикетка. Например, если Вышеуказанная модель производителя определена в другое приложение, называемое "производство", вам нужно будет использовать:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

Этот тип ссылок может быть полезен. при разрешении циркулярного импорта зависимости между двумя приложениями.

16
ответ дан 5 December 2019 в 07:58
поделиться

иногда, django.db.models.get_model помогает работать с круговым импортом. В вашем примере попробуйте нормально импортировать Entry и отчеканите определение FK в Entry до следующего:

from django.db.models import get_model

class Entry(models.Model):
    division = models.ForeignKey(get_model('competitions', 'Division'))
5
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: