2012-01-21 2 views
4

есть интересный один здесь .. Я сократил модели, чтобы сделать его легче понять ..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 связывает участника путешествие, теперь путешествие абстрактно, потому что это может быть сделано любым количеством различных способов транспорта, каждый из которых будет иметь свои собственные поля. Я думаю, что эта установка является правильной, но я получаю следующее сообщение об ошибке:

Error: One or more models did not validate: kandersteg.planejourney: 'participants' is a manually-defined m2m relation through model ParticipantJourney, which does not have foreign keys to Participant and PlaneJourney

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

Приветствия, Alex

ответ

0

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

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

+1

Да, это работает, но побеждает объект, когда он имеет его как абстрактный :( –

+0

Добавлена ​​модель участника, она сильно уменьшена (ну и все модели), но вы получаете суть –

+0

Я лично считаю, что это может быть ошибка в django, потому что я посмотрел на код, где это генерируется, и он, похоже, не учитывает поля GenericForeignKey, когда он искал два ForeignKeys, чтобы составить ManyToMany –

1

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

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

Смежные вопросы