2010-06-23 93 views
1

好吧,我在描述的狗屎。這是一個關係診斷。 relationship diag http://img248.imageshack.us/img248/3568/surveyrel.jpgDjango爲子類設計的模型/數據庫設計

在Django中我做了我的車型,如:

from django.db import models 
from datetime import datetime 

class Survey(models.Model): 
    name = models.CharField(max_length=100) 
    pub_date = models.DateTimeField('date published',default=datetime.now) 
    def __unicode__(self): 
     return self.name 

# This model should be abstracted by a more specific model 
class Section(models.Model): 
    survey = models.ForeignKey(Survey) 
    name = models.CharField(max_length=100) 
    def __unicode__(self): 
     return self.name 

# Models for supporting the 'ratings' mode 
class RatingSection(Section): 
    pass 

class RatingQuestion(models.Model): 
    section = models.ForeignKey(RatingSection) 
    name = models.CharField(max_length=255) 
    def __unicode__(self): 
     return self.name 

class RatingAnswer(models.Model): 
    section = models.ForeignKey(RatingSection) 
    name = models.CharField(max_length=60) 
    def __unicode__(self): 
     return self.name 

class RatingVotes(models.Model): 
    question = models.ForeignKey(RatingQuestion) 
    answer = models.ForeignKey(RatingAnswer) 
    votes = models.PositiveIntegerField(default=0) 
    def __unicode__(self): 
     return self.votes + self.answer.name + ' votes for ' + self.question.name 

# Models for supporting the 'multichoice' mode 
class MultiChoiceSection(Section): 
    can_select_multiple = models.BooleanField() 

class MultiChoiceQuestion(models.Model): 
    section = models.ForeignKey(MultiChoiceSection) 
    name = models.CharField(max_length=255) 
    def __unicode__(self): 
     return self.name 

class MultiChoiceAnswer(models.Model): 
    section = models.ForeignKey(MultiChoiceSection) 
    name = models.CharField(max_length=60) 
    votes = models.PositiveIntegerField(default=0) 
    def __unicode__(self): 
     return self.name 

的問題是,我幾乎可以肯定,這不是做正確的方式,即使是這樣,我可以」 t解決了如何讓Django中的管理區域向用戶顯示一個選擇,詢問他們想要的部分子類型。

什麼是構建這種模型的最佳方法?

+0

也許你可以描述更詳細一點你需要什麼你的「節」呢? – 2010-06-24 01:23:34

+0

Idealy我希望每個調查都有不同類型的多個部分(例如多項選擇或評級),並且我希望每個不同類型都是泛型類的子類。但是,我不確定這是否是最好的數據庫模型 - 我確定它不是。 – 2010-06-24 04:22:08

回答

0

你也可以有一個部分類,有一個屬性type,可以是評級或多選 - 這將被顯示在管理員然後作爲選擇框。
但我認爲你應該看看Django的可能性創造抽象的模型:http://docs.djangoproject.com/en/dev/topics/db/models/#id6

class Section(models.Model): 
    survey = models.ForeignKey(Survey) 
    name = models.CharField(max_length=100) 

    class Meta: 
     abstract = True  # no db table created for this model 

    def __unicode__(self): 
     return self.name 


class RatingSection(Section): 
    pass 

class MultiChoiceSection(Section): 
    can_select_multiple = models.BooleanField() 
+0

儘管如此,我將如何實現該「類型」屬性。理想情況下,我希望它只列出Section的所有子類,因此我不必手動更改類型處理。 – 2010-06-25 13:20:17

+0

那麼如果你從上面拿出我的解決方案,你只需要爲evey Section類註冊一個ModelAdmin,然後你可以在管理中有一個單獨的部分來編輯這個類的實例! 或第二種解決方案:您有一個具有「選擇」屬性的類,可以是「評級」或「多選」,請參閱http://www.djangoproject.com/documentation/models/choices/瞭解如何實施字段選擇! – 2010-06-25 14:49:18