3

我需要制作一个具有 15 个相似字段的模型(我们称它们field_01为 、field_02field_03等)。我还需要这些字段易于使用(例如,能够执行类似的操作obj.field_01)。因为我想快速完成一些事情,所以我只是用愚蠢的方式创建了它们:

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

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

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

4

3 回答 3

3

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

一对多

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)
于 2012-08-10T19:00:39.597 回答
1

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

for i in range(1, 10):
    M.add_to_class('field_%s' % s, NullBooleanField())
于 2012-08-10T18:25:36.803 回答
0

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

要阅读有关完成此检查的一堆库的优缺点的更多信息:https ://stackoverflow.com/a/7934577/884453

于 2012-08-10T19:17:32.760 回答