每个实例动态字段django模型

时间:2010-05-18 04:58:16

标签: django dynamic model field

我有一个带有JSON字段的模型或指向CouchDB文档的链接。我目前可以通过以下方式访问动态信息:

genericdocument.objects.get(pk=1) == genericdocument.json_field['sample subfield']

相反,我想使用

genericdocument.sample_subfield

保持与项目当前共享的所有应用程序的兼容性。

更新

这与我正在努力实现的目标非常接近:http://pypi.python.org/pypi/eav-django/1.0.0但是使用Django标准字段。

2 个答案:

答案 0 :(得分:1)

这有帮助:

class GenericDocument(models.Model):
...
@property
def sample_subfield(self):
    return self.json_field['sample_subfield']

如果没有太多,那对于已知的“sample_subfields”应该可行。

如果您希望能够拨打genericdocument.XXX(其中XXX可以任何内容),那么您必须覆盖模型中的__getattribute__,我不会因为afaik Django自己就这样做了。

答案 1 :(得分:1)

这个问题帮助我找到了解决方案:How do I override __getattr__ in Python without breaking the default behavior?

class GenericDocument(models.Model):
    def __getattr__(self, name):
        data = self.get_couchdb_data()
        if name in data.keys():
            return data[name]
        else:
            raise AttributeError

get_couchdb_data()返回的字典作为模型实例的属性公开。