我有一个带有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标准字段。
答案 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()返回的字典作为模型实例的属性公开。