【问题标题】:Unknown fields in Django ModelDjango 模型中的未知字段
【发布时间】:2010-07-06 08:46:26
【问题描述】:

我希望为包含不同类型“文章”的单个表格构建一个模型(为了论证)。

每篇文章都有最常见的字段(例如标题、日期等),但在某些情况下,某些文章类型(我无法控制)的字段要求和各自的验证规则略有不同。任何字段都不会保存特别大量的数据(最大约 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 增加了一些不幸的开销。

谢谢。

【问题讨论】:

    标签: xml json django-models


    【解决方案1】:

    这是……一种非常糟糕的方法。通常,您会将这些数据放入单独的表中并与之关联,但是……无论如何。

    django-picklefield

    【讨论】:

    • 您能否详细说明“将数据放入单独的表中并与之关联”?我认为我的主要问题是我不知道在那个单独的表中放置哪些字段 - 这让我回到了我开始的地方。那个picklefield 看起来很方便,但可能有点矫枉过正,因为额外的未知字段将是例外而不是常态。会检查的。
    • @Sean 而不是编辑帖子,您应该评论它并说明为什么该行在答案中没有用。
    【解决方案2】:

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

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

    你会添加一个:

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

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

    【讨论】:

    • 感谢您的提醒,我会看看这个。
    【解决方案3】:

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

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

    您需要这种灵活的字段是否有特殊原因?
    他们可能会从后台更改吗?

    【讨论】:

    • 谢谢,抽象父类看起来很有希望。我不应该将我的问题表述为“文章”,所以让我试着澄清一下。我的应用程序要求用户保存各种支付网关的凭据/设置。设置因网关而异 - 例如,某些网关具有用于重复交易的附加凭据)。我希望开发一个可以根据需要添加支付网关的系统 - 但仍然能够执行简单的查询以按用户查找所有网关(即,无需手动对所有网关模型运行查询。这有意义吗?任何建议?
    猜你喜欢
    • 2011-04-16
    • 2015-02-19
    • 2015-04-24
    • 1970-01-01
    • 2016-12-23
    • 2016-03-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多