2010-07-06 79 views
1

我希望能为包含不同类型的“文章”(出于参数的原因)的单个表建立模型。Django中的未知字段模型

每篇文章将有大部分常见字段(例如标题,日期等),但有些情况下某些文章类型(我的控制范围之外)的字段要求和各自的验证规则略有不同。没有字段会保存特别大量的数据(最多〜100个字符)。

目前我正在考虑定义所有常见的字段,然后有任何不寻常的领域,在XML/JSON进行详细的文本字段的模型:

class Article(models.Model): 
    owner = models.ForeignKey('User') 
    title = models.CharField(max_length=20) 
    published = models.BooleanField() 
    extra = model.TextField() # XML/JSON here for any unusual fields 
    created = models.DateField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True, auto_now_add=True) 
    # ... etc. 

我会创造Django的表单类处理验证,因为新的文章类型被添加,但我试图避免为不同的文章类型有不同的表格。

是否有一种普遍接受的方式来处理这样的情况,还是主观上很主观?显然,XML/JSON增加了一些不幸的开销。

谢谢。

回答

0

难道你不能用GenericForeignKeys做到这一点?

http://www.djangoproject.com/documentation/models/generic_relations/

你想补充一个:

extra_type = models.ForeignKey(ExtraType) 
extra = generic.GenericForeignKey() 

到模型。似乎比包含json更好。

+0

即使'GenericForeignKey'需要指向另一个模型。 – 2010-07-06 09:00:05

+0

谢谢你的提醒,我会看看这个。 – 2010-07-06 09:33:20

1

这是一个非常可怕的方式来做到这一点。通常情况下,你会把这些数据放到一个单独的表中并与之相关,但是......无论如何。

django-picklefield

+0

您可否详细说明“将数据放入单独的表格并与之相关”?我认为我的主要问题在于,我不知道将哪些字段放在单独的表格中 - 这将我带回我开始的地方。那picklefield看起来很方便,但可能过度杀伤,因为额外的未知领域将是例外而不是常态。将检查出来。 – 2010-07-06 09:39:59

+1

@Sean而不是编辑帖子,你应该评论它,并说出为什么该行在答案中没有用。 – aledalgrande 2014-06-04 18:20:38

0

我要做的就是创建一个从Article模型继承的典范。
如果你想为每个模型创建一个表,只需在你的元类中标记abstract = True
如果你想创建一个与基地Article一对一的关系,只需确保你的元类abstract = False
使用south将新模型迁移到数据库并完成。

有关模型继承的更多详细信息,请参阅this articlethis document

是否有一个特殊的原因,你需要这种领域的灵活性?
他们可能从后台改变?

+0

谢谢,抽象的父类看起来很有前途。我不应该把我的问题说成是“文章”,所以让我试着清除它。我的应用程序要求用户保存各种支付网关的凭证/设置。设置因网关而异 - 例如,某些网关具有额外的循环交易凭证)。我希望开发一个可以根据需要添加支付网关的系统 - 但仍然可以通过简单查询来查找用户所有的网关(即无需手动对所有网关模型运行查询,这是否有意义?建议? – 2010-07-06 21:33:57