我正在编写一个包含民意调查部分的Django应用程序,我想提供创建不同类型问题的能力。所以,我有评级部分的这些模型
# Do I really need this class?
class BaseRating(models.Model):
class Meta:
abstract = True
# For questions like: "Rate your experience with XXXXX"
class FiveStarRating(BaseRating):
rating = models.PositiveSmallIntegerField(null=True, blank=True, validators=[MaxValueValidator(5)])
# For questions like: "Would you recommend XXXXX"?
class YesNoRating(BaseRating):
rating = models.BooleanField()
我现在想创建一个新问题,我想为它指定评级系统:
如果我创建问题“你如何评价xxxxx”,我会使用FiveStarRating模型
如果我创建问题“你对xxxx满意吗”,我会使用YesNoRating
那么,我应该如何设计问题模型?
class Question(models.Model):
title = models.CharField(max_length=255)
# rating??
# I can't create a foreignkey field to the base class...
编辑:我最终使用django-dynamic-forms,但我认为第一个回复也是可接受的
答案 0 :(得分:1)
从我所看到的情况来看,你没有使用BaseRating
模型,所以删除它是安全的。
至于问题,在我的情况下,我将创建两个具有FiveStarRating
和YesNoRating
外键的新模型,因此数据可以互相排斥。所以你最终会有两个这样的模型。
class FiveStarQuestion(models.Model):
title = models.CharField(max_length=255)
rating = fields.ForeignKey(FiveStarRating)
class YesNoQuestion(models.Model):
title = models.CharField(max_length=255)
rating = fields.ForeignKey(YesNoRating)
但如果您想在两个问题中分享标题(我会采用这种方法,因为可能有两个问题具有相同的标题)
实施例: 您如何评价 Stackoverflow
和
Stackoverflow
对您的满意程度如何?只有一个名为 Stackoverflow 的标题是有意义的,并在我们的表中将该Reference用作外键。因此,在这种情况下,您可以保留Question
模型并指定指向它的ForiegnKey
字段。
class Question(models.Model):
title = models.CharField(max_length=255)
创建两个模型如下:
class FiveStarQuestion(models.Model):
title = models.ForeignKey(Question)
rating = fields.ForeignKey(FiveStarRating)
class YesNoQuestion(models.Model):
title = models.ForeignKey(Question)
rating = fields.ForeignKey(YesNoRating)