2017-02-19 69 views
0

我正在编写一个包含投票部分的Django应用程序,并且我想提供创建不同类型问题的能力。所以,我有这些模型的评价部分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

从我所看到的,你不使用BaseRating模型什么的第一反应,所以删除它是安全的。

对于这些问题,在我的情况,我将创建一个有外键既​​和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) 

,但如果你想分享的两个问题中的标题(我想第二个这种做法,因为有可能是具有相同标题的两个问题)

例: 您如何评价#1

如何不满意,您可以与#1

只有一个标题叫做Stackoverflow并且在表中使用该引用作为外键是很有意义的。因此,在这种情况下,您可以保留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) 
+0

谢谢!试图在这种方法中适用另一个必要条件:一个模型民意调查,其中包含与所有问题的多元关系(因为同一民意调查可以有不同类型的问题,同一问题可以在多个民意调查中)。我不想在Poll模型中有两个字段(一个用于YesNoQuestions,另一个用于FiveStarQuestion)。 – jorgeas80

相关问题