2

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

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...

谢谢你。

4

2 回答 2

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

于 2012-12-16T05:31:20.343 回答
1

您绝对不能使字段有条件;想想这将如何(或不会)在数据库中工作。

为每种类型创建 Thread 子类是一种选择,但您必须使用 GenericForeignKeys 在 Thread 子类和另一个模型之间创建关系。如果极高的性能是主要考虑因素,GenericForeignKeys 的性能就不那么好了。

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

于 2012-12-16T05:31:33.213 回答