ManyToManyField с помощью абстрактной модели - PullRequest
4 голосов
/ 21 января 2012

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

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

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

Ура, Алекс

Ответы [ 2 ]

1 голос
/ 03 декабря 2012

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

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

0 голосов
/ 21 января 2012

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

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

...