python - Django 虚拟字段 : set value of a property from a virtual field

标签 python django django-models

我正在尝试了解 django ModelFields 的内部结构以在 django-hstore 上实现一项新功能.

基本上我想从具有预定义架构的 HStore 字典创建虚拟字段。

作为第一步,我想隐藏实际的 HStore 字典字段并使用虚拟字段中存在的值来组成最终的 HStore 字典。

我已经能够让管理员对除保存操作之外的所有操作正常工作,保存操作不会将虚拟字段的值保存到 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)

models.py(只是原型(prototype)制作)

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 文档中 "The SubfieldBase metaclass" “自定义模型字段”页面中的部分看起来像我需要的。

这是正确的道路吗?

有没有例子可以学习?

任何人都可以提供一个例子,说明如何设置hstore字段“data”的键“number”的值并将其存储在数据库中? 从那里我想我知道如何继续前进。

谢谢...

最佳答案

正确的答案是使用 python 描述符,实现的解决方案在这里:

https://github.com/djangonauts/django-hstore/blob/8229e850e1631d8fd038436d2aa1fccb26b9a699/django_hstore/virtual.py#L29

此功能最初是为一个名为 nodeshot 的开源项目开发的,下面是一个示例实现,其架构取自 settings.py:

https://github.com/ninuxorg/nodeshot/blob/028bb28009bf73b2a4fc087f811e1b66c958907e/nodeshot/core/nodes/models/node.py#L49

关于python - Django 虚拟字段 : set value of a property from a virtual field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24332909/

相关文章:

django - 使用 Django 配置 mongoDB

python - 在没有本地网络服务器的情况下在 Python 中使用 Google 客户端库

python - 这个 App Engine Ndb 语法是如何工作的?

python - 无法使用opencv获得我想要的分辨率

javascript - 使用python将base64字符串转换为png图像

python - 当父模型有多个外键时,Django外键反向访问

python - 如何在两个数组均非零的情况下减去某个值?

python - 如何使用 SwampDragon 创建带有外键的模型?

Django jQuery ajax 发布到 https 失败

python - Django - 如何使用 South 重命名模型字段?