nem*_*ign 5 python django django-models
我正在尝试理解django ModelFields的内部,以在django-hstore上实现一个新功能.
基本上我想从具有预定义模式的HStore Dictionary创建虚拟字段.
作为第一步,我想隐藏实际的HStore Dictionary字段,而是使用虚拟字段中的值来组成最终的HStore Dictionary.
我已经能够使管理工作正常用于除了保存操作之外的所有操作,保存操作不会将虚拟字段的值保存到HStore字典中.
这是我的实际VirtualField代码:
# 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)
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
我以为save_form_data可以做到这一点,但事实并非如此.
在django docs中,我在"自定义模型字段"页面中找到了"SubfieldBase元类"部分,它看起来就像我需要的那样.
这是正确的道路吗?
有什么例子可以研究吗?
任何人都可以提供一个如何设置hstore字段"data"的键"number"的值并将其存储在数据库中的示例?从那里我想我知道如何继续前进.
谢谢...
正确的答案是使用 python 描述符,实现的解决方案在这里:
此功能最初是为名为nodeshot的开源项目开发的,下面是一个示例实现,其架构取自settings.py:
| 归档时间: |
|
| 查看次数: |
3105 次 |
| 最近记录: |