Django:使用其他模型类作为字段的选择

时间:2017-02-19 17:04:12

标签: python django oop django-models

我正在编写一个包含民意调查部分的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,但我认为第一个回复也是可接受的

1 个答案:

答案 0 :(得分:1)

从我所看到的情况来看,你没有使用BaseRating模型,所以删除它是安全的。

至于问题,在我的情况下,我将创建两个具有FiveStarRatingYesNoRating外键的新模型,因此数据可以互相排斥。所以你最终会有两个这样的模型。

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)