如何在架构和无模式模式下同时使用Django HStore DictionaryField?

时间:2016-07-07 13:44:41

标签: python django django-models django-admin django-hstore

当我在Django模型中使用hstore.DictionaryField()传递没有参数并在Djano admin中注册我的模型时,我可以在管理界面中动态创建新的键值行。

当我在架构模式hstore.DictionaryField(schema=['some schema description'])中使用相同的字段时,我会获得schema参数中描述的固定数量的字段。

我是否可以同时拥有这两个功能,即在架构描述中列出某些类型的固定字段,同时还能添加新字段?

UPD

解决这个问题的一种方法可能是使用两个 DictionaryField,其中一个是模式,另一个是无模式的,但它不是最佳解决方案。

1 个答案:

答案 0 :(得分:0)

答案是否定的,你不能同时拥有hstore库的当前实现。看看init函数(这是来自github上的源代码):

class DictionaryField(HStoreField):
    description = _("A python dictionary in a postgresql hstore field.")

    def __init__(self, *args, **kwargs):
        self.schema = kwargs.pop('schema', None)
        self.schema_mode = False
        # if schema parameter is supplied the behaviour is slightly different
        if self.schema is not None:
            self._validate_schema(self.schema)
            self.schema_mode = True
            # DictionaryField with schema is not editable via admin
            kwargs['editable'] = False
            # null defaults to True to facilitate migrations
            kwargs['null'] = kwargs.get('null', True)

        super(DictionaryField, self).__init__(*args, **kwargs)

您可以看到,如果设置了架构,那么该字段的editable参数将设置为false,这是Django管理员查看是否应该允许您在管理UI中编辑值的内容。

不幸的是,你只有几个选项:通过创建自己继承自那个的类来自己覆盖它,或者在github页面上打开一个pull请求或问题,并希望有人能够访问它。