在这里有一个有趣的...我缩短了模型,使其更容易理解..
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:'参与者'是通过模型ParticipantJourney手动定义的m2m关系,它没有参与者和PlaneJourney的外键
我需要保留链接表的手动定义,这样我也可以将付款链接到所说的旅程,所以我真的不知道下一步该怎么做,如果有人能说清楚我真的会感激!
干杯, 亚历
答案 0 :(得分:1)
Django不认为通用外键是直通模型中所需的外键,目前没有办法在抽象基类中用through定义ManyToMany关系。
但是,django(ticket #11760)中有一项功能请求,您还可以在通过字段中使用%(class)s
,例如在through='Pariticipant_%(class)s'
模型中使用Journey
,然后您必须为Journey
的每个子项手动创建一个tot表。但正如我所说,它只是一个开放的功能请求。
答案 1 :(得分:0)
您可以尝试将Journey定义为不抽象,但随后您将数据拆分为多个表。
我在这里发现了一些令人沮丧的事情:https://stackoverflow.com/a/3821384/1156004