通过使用 Django 多态模型的关系
Through relationship using Django polymorphic model
我正在尝试在 RankedAthlete
模型中使用多态和非多态 table 之间的直通关系:
class ChoiceBlank(PolymorphicModel):
pass
class ChoiceAthlete(ChoiceBlank):
choice = models.ForeignKey('SomeModel', on_delete=models.CASCADE)
class BetMultiple(models.Model):
answer = models.ManyToManyField('ChoiceBlank', blank=True, through='RankedAthlete')
class RankedAthlete(models.Model):
choiceAthlete = models.ForeignKey('ChoiceBlank', on_delete=models.CASCADE)
bet = models.ForeignKey('BetMultiple', on_delete=models.CASCADE)
rank = models.IntegerField()
这不起作用,因为 RankedAthlete
需要一个 ChoiceBlank
并且在我创建一个时会引发 ValueError
。相反,如果我将 choice 替换为 ChoiceAthlete
.
,我将无法迁移我的数据库
Django-polymorphic 文档没有提到我的用例,它不受支持吗?有什么办法可以做到这一点吗?
这似乎是不可能的。
作为替代方案,由于我只需要一种使用有序 answer
的类型,我使用子模型而不是父模型专门为其创建了一个模型,并相应地更改了 RankedAthlete
:
class BetMultipleOrdered(models.Model):
answer = models.ManyToManyField('ChoiceAthlete', blank=True, through='RankedAthlete')
class RankedAthlete(models.Model):
choiceAthlete = models.ForeignKey('ChoiceAthlete', on_delete=models.CASCADE)
bet = models.ForeignKey('BetMultiple', on_delete=models.CASCADE)
rank = models.IntegerField()
另一种选择是使用 ContentType。
我正在尝试在 RankedAthlete
模型中使用多态和非多态 table 之间的直通关系:
class ChoiceBlank(PolymorphicModel):
pass
class ChoiceAthlete(ChoiceBlank):
choice = models.ForeignKey('SomeModel', on_delete=models.CASCADE)
class BetMultiple(models.Model):
answer = models.ManyToManyField('ChoiceBlank', blank=True, through='RankedAthlete')
class RankedAthlete(models.Model):
choiceAthlete = models.ForeignKey('ChoiceBlank', on_delete=models.CASCADE)
bet = models.ForeignKey('BetMultiple', on_delete=models.CASCADE)
rank = models.IntegerField()
这不起作用,因为 RankedAthlete
需要一个 ChoiceBlank
并且在我创建一个时会引发 ValueError
。相反,如果我将 choice 替换为 ChoiceAthlete
.
Django-polymorphic 文档没有提到我的用例,它不受支持吗?有什么办法可以做到这一点吗?
这似乎是不可能的。
作为替代方案,由于我只需要一种使用有序 answer
的类型,我使用子模型而不是父模型专门为其创建了一个模型,并相应地更改了 RankedAthlete
:
class BetMultipleOrdered(models.Model):
answer = models.ManyToManyField('ChoiceAthlete', blank=True, through='RankedAthlete')
class RankedAthlete(models.Model):
choiceAthlete = models.ForeignKey('ChoiceAthlete', on_delete=models.CASCADE)
bet = models.ForeignKey('BetMultiple', on_delete=models.CASCADE)
rank = models.IntegerField()
另一种选择是使用 ContentType。