2010-06-23 92 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