好的,所以我不想创建像这样的论坛应用程序:
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...
谢谢。
答案 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)并包含一个字段,其中包含不同类型的选项。使用类型字段,您可以指定用于呈现项目的模板和/或您可以按类型进行过滤。