2017-02-19 73 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

相關問題