django动态场模型结构

时间:2012-12-16 04:32:59

标签: django database-design model

好的,所以我不想创建像这样的论坛应用程序:

class Section(models.Model):
    section_name = models.CharField(max_length = 200)

class Thread(models.Model):
    title = models.CharField(max_length = 200) 
    content = models.TextArea()

但是,我想要4种类型的Thread用户可以提交文本或链接或图像或仅包含图像的链接。 content字段将根据类型而变化。这样做的最佳方法是什么?我是否需要为每种类型定义SubThread?或者我可以这样定义:

class Thread(models.Model):
THREAD_TYPE = (
    ('text', 'Text'),
    ('link', 'Link'),
        ('imge', 'Image'),
    ('limg', 'Link Image'), 
)

type = models.CharField(max_length = 4, choices = THREAD_TYPE)
    title = models.CharField(max_length = 200) 
if self.type == 'text':
    content = models.CharField(max_length = 200)
# and so on...

谢谢。

2 个答案:

答案 0 :(得分:1)

听起来你想要模型继承。您拥有的if语句将不起作用,因为在保存模型之前不会设置类型。将模型视为数据库设计。需要为整个表存在一列,而不仅仅是表的一部分。这是模型继承的一个例子:

Class Thread(models.Model):
    title = models.CharField(max_length = 200)

    class Meta:
        abstract = True

Class ThreadText(Thread):
    content = models.CharField(max_length = 200)

Class ThreadLink(Thread):
    link = models.URLField()

您还可以参考文档以获取更多信息https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance

答案 1 :(得分:1)

你绝对不能让字段有条件;考虑一下(或不会)在数据库中的工作方式。

为每种类型创建一个Thread子类是一个选项,但您必须使用GenericForeignKeys在Thread子类和另一个模型之间创建关系。如果非常高的性能是主要考虑因素,GenericForeignKeys表现不佳。

另一种选择是定义Thread以支持所有类型(例如,具有FileField,URLField)并包含一个字段,其中包含不同类型的选项。使用类型字段,您可以指定用于呈现项目的模板和/或您可以按类型进行过滤。