Django虚拟字段:从虚拟字段设置属性值
我正在尝试理解Django中的ModelFields的内部工作原理,以便在django-hstore上实现一个新功能。
简单来说,我想从一个有预定义结构的HStore字典中创建虚拟字段。
作为第一步,我想隐藏实际的HStore字典字段,而是使用虚拟字段中的值来组成最终的HStore字典。
我已经能够让管理后台在所有操作中正常工作,除了保存操作,它没有把虚拟字段的值保存到HStore字典中。
这是我现在的虚拟字段代码:
# virtual.py
from django.db.models.fields import Field
class VirtualField(Field):
""" Virtual Field """
def __init__(self, *args, **kwargs):
try:
self.hstore_field_name = kwargs.pop('hstore_field_name')
except KeyError:
raise ValueError('missing hstore_field_name keyword argument')
super(VirtualField, self).__init__(*args, **kwargs)
def contribute_to_class(self, cls, name, virtual_only=True):
super(VirtualField, self).contribute_to_class(cls, name, virtual_only)
def value_from_object(self, obj):
"""
Returns the value of this field in the given model instance.
"""
hstore_field = getattr(obj, self.hstore_field_name)
return hstore_field[self.attname]
def save_form_data(self, instance, data):
hstore_field = getattr(instance, self.hstore_field_name)
hstore_field[self.attname] = data
setattr(instance, self.hstore_field_name, hstore_field)
models.py(只是原型设计)
class ModeledDataBag(models.Model):
name = models.CharField(max_length=32)
data = hstore.ModeledDictionaryField(schema={
'number': {
'type': int,
'default': 0
}
})
number = VirtualField(hstore_field_name='data')
objects = hstore.HStoreManager()
我原以为save_form_data可以解决这个问题,但事实并非如此。
在Django的文档中,我找到了“SubfieldBase元类”这一部分,看起来像是我需要的东西。
这是我应该走的正确路径吗?
有没有什么例子可以学习一下?
有没有人能提供一个如何设置HStore字段“data”的键“number”的值并将其存储到数据库中的例子?这样我就知道该怎么继续了。
谢谢...
1 个回答
4
正确的做法是使用 Python 的描述符,具体的解决方案可以在这里找到:
这个功能最初是为一个叫做 nodeshot 的开源项目开发的,这里有一个示例实现,使用的结构来自 settings.py: