2012-01-21 90 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

我需要保持鏈接表的手工定義,所以我還可以鏈接進行付款,說的旅程,所以我真的不知道下一步該怎麼做,如果任何人都可以擺脫一些光,我會非常感激!

乾杯,亞歷克斯

回答

0

你可以嘗試定義旅程不是抽象的,但你得到多個表中的數據拆分。

我發現這裏有些東西interessing:https://stackoverflow.com/a/3821384/1156004

+1

是的工作,但擊敗了它作爲抽象的對象:( –

+0

增加了參與者模型,它減少了很多(以及所有的模型都很好),但你得到的主意 –

+0

我個人認爲這可能是一個錯誤django是因爲我查看了生成這個代碼的代碼,當它尋找兩個ForeignKeys來構成ManyToMany時,它似乎沒有考慮到GenericForeignKey字段。 –

1

Django不考慮通用外鍵所需的外鍵通過模型,目前沒有辦法來定義一個抽象基類通過一個多對多關係。

但是,在django中有一個功能請求(ticket #11760),它允許您在直通領域也使用%(class)s,例如,通過在Journey模型中使用through='Pariticipant_%(class)s',然後您必須爲Journey的每個孩子手動創建表格。但正如我所說,它只是一個開放的功能請求呢。