【问题标题】:Repeated fields in django modelsDjango 模型中的重复字段
【发布时间】:2012-08-08 00:58:01
【问题描述】:

我需要创建一个具有 15 个相似字段的模型(我们称它们为 field_01field_02field_03 等)。我还需要这些字段易于使用(例如,能够执行obj.field_01 之类的操作)。因为我想快速实现某些东西,所以我只是以愚蠢的方式创建它们:

class M (models.Model):
    ....
    field_01 = models.NullBooleanField()
    field_02 = models.NullBooleanField()
    ....

我在网上搜索了一个更好的方法来做到这一点。有人说使用 setattr,但据我阅读和尝试一些东西可以看出,这会将属性添加到类的实例,而不是类本身,这意味着当我尝试将模型表单附加到此模型,它不会看到添加了setattr 的字段。然后我尝试重写 __new__ 函数,这将允许我在创建该类的实例之前向该类添加属性。但我无法弄清楚如何准确地做到这一点。

那么,有什么方法可以在不破坏 South 和模型形式且不复制粘贴的情况下生成这些字段?

【问题讨论】:

    标签: django model field


    【解决方案1】:

    如果没有具体的例子说明你在做什么,很难明确地说出来,但一般来说,如果你发现自己重复了一个领域,那么这是一对多或多对多关系的明确标志,而不是:

    一对多

    class Field(models.Model):
        m = models.ForeignKey(M, related_name='fields')
        field = models.NullBooleanField()
    

    多对多

    class Field(models.Model):
        field = models.NullBooleanField()
    
    class M(models.Model):
        fields = models.ManyToManyField(Field)
    

    【讨论】:

    • 我最终做了这样的事情。谢谢!
    • @ChrisPratt 我永远对你不是演员 Chris Pratt 感到失望。在小尺寸下,您的头像看起来像他,而且演员在编程板上也有如此高声望的想法似乎很酷。
    【解决方案2】:

    Django 模型有一个add_to_class 方法,您可以按照您喜欢的方式(ab)使用猴子修补模型。

    for i in range(1, 10):
        M.add_to_class('field_%s' % s, NullBooleanField())
    

    【讨论】:

      【解决方案3】:

      听起来您正在寻找一个 EAV 风格的数据库。你应该尝试一个库而不是自己滚动。为此,Django EAV 看起来非常棒。 https://github.com/mvpdev/django-eav

      要了解更多关于完成此检查的一堆库的优缺点:https://stackoverflow.com/a/7934577/884453

      【讨论】:

        猜你喜欢
        • 2014-09-04
        • 2012-10-22
        • 1970-01-01
        • 2012-09-15
        • 2019-06-30
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 2011-04-25
        相关资源
        最近更新 更多