【问题标题】:Django Model/Database design for subclasses子类的 Django 模型/数据库设计
【发布时间】:2011-03-07 10:20:01
【问题描述】:

好吧,我不擅长描述。这是一个关系诊断。

在 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

问题是我几乎可以肯定这不是正确的方法,即使是这样,我也无法弄清楚如何允许 Django 中的管理区域向用户显示选择,询问什么他们想要的部分的子类型。

构建此类模型的最佳方法是什么?

【问题讨论】:

  • 也许你可以更详细地描述一下你需要你的“部分”做什么?
  • 理想情况下,我希望每个调查都有多个不同类型的部分(例如多项选择或评分),并且我希望每个不同的类型都是通用类 Section 的子类。但是,我不确定这是否是最好的数据库模型——我很确定它不是。

标签: python django database-design django-models django-admin


【解决方案1】:

您也可以有一个部分类,有一个属性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()

【讨论】:

  • 我将如何实现该“类型”属性。理想情况下,我希望它简单地列出 Section 的所有子类,这样我就不必手动更改类型处理。
  • 好吧,如果您从上面采用我的解决方案,您只需为每个 Section 类注册一个 ModelAdmin,然后您将在管理员中有一个单独的 Section 来编辑此类的实例!或者第二种解决方案:您有一个类,其属性choices 可以是“评分”或“多项选择”,请参阅djangoproject.com/documentation/models/choices,了解如何实现字段选择!
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多