ManyToManyField со сквозной абстрактной моделью

Здесь есть интересная вещь.. Я сократил модели, чтобы их было легче понять..

class Participant(Person):
    passport_number = models.IntegerField(verbose_name=_('Passport Number'), db_column=u'PassportNumber')

    class Meta:
        db_table = u'Participant'

class Journey(BaseModel):
    participants = models.ManyToManyField(Participant, related_name='%(app_label)s_%(class)s_participants', through=u'ParticipantJourney')

    class Meta:
        abstract = True

class PlaneJourney(Journey):
    flight_number = models.CharField(max_length=16, verbose_name=_('Flight Number'), db_column=u'FlightNumber')

    class Meta:
        db_table = u'PlaneJourney'

class ParticipantJourney(BaseModel):
    participant = models.ForeignKey(Participant, verbose_name=_('Participant'), db_column=u'ParticipantId')

    journey_content_type = models.ForeignKey(ContentType, related_name='journey_content_type')
    journey_object_id = models.PositiveIntegerField()
    journey = generic.GenericForeignKey('journey_content_type', 'journey_object_id') # models.ForeignKey(Journey, verbose_name=_('Journey'), db_column=u'JourneyId')

    payment_content_type = models.ForeignKey(ContentType, related_name='payment_content_type')
    payment_object_id = models.PositiveIntegerField()
    payment = generic.GenericForeignKey('payment_content_type', 'payment_object_id') # models.ForeignKey(Payment, verbose_name=_('Payment'), db_column=u'PaymentId')

    class Meta:
        db_table = u'ParticipantJourney'

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

Ошибка: одна или несколько моделей не прошли проверку: kandersteg.planejourney: «участники» — это определенное вручную отношение m2m через модель ParticipantJourney, которая не имеет внешних ключей для участников и PlaneJourney.

Мне нужно сохранить ручное определение таблицы ссылок, чтобы я также мог связать платеж с указанным путешествием, поэтому я действительно не знаю, что делать дальше с этим, если бы кто-нибудь мог пролить свет, я был бы очень благодарен!

Привет, Алекс


person Alex Latchford    schedule 21.01.2012    source источник


Ответы (2)


Django не считает общие внешние ключи необходимыми внешними ключами в сквозной модели, и в настоящее время нет способа определить отношение ManyToMany со сквозным в абстрактном базовом классе.

Однако в django есть запрос функции (билет № 11760), который позволяет вам также использовать %(class)s в сквозном поле, например. используя through='Pariticipant_%(class)s' в модели Journey, а затем вы должны вручную создать сквозную таблицу для каждого дочернего элемента Journey. Но, как я уже сказал, пока это просто открытый запрос функции.

person Amir Ali Akbari    schedule 03.12.2012

Вы можете попытаться определить Journey как не абстрактный, но тогда вы получите данные, разделенные на несколько таблиц.

Я нашел здесь кое-что интересное: https://stackoverflow.com/a/3821384/1156004

person Martin    schedule 21.01.2012
comment
Да, это работает, но побеждает цель сделать его абстрактным :( - person Alex Latchford; 21.01.2012
comment
Добавлена ​​модель участника, она сильно уменьшилась (ну и все модели тоже), но суть понятна - person Alex Latchford; 21.01.2012
comment
Я лично думаю, что это может быть ошибка в django, потому что я просмотрел код, в котором это генерируется, и, похоже, он не учитывает поля GenericForeignKey, когда он искал два ForeignKeys для создания ManyToMany - person Alex Latchford; 21.01.2012
comment
Было бы действительно плохо сделать его не абстрактным? - person Martin; 21.01.2012
comment
Нет, не будет, но я подумал, что посмотрю, знает ли кто-нибудь способ заставить его работать, прежде чем сдаваться. - person Alex Latchford; 22.01.2012