如何同时在模式和无模式模式下使用Django HStore DictionaryField?
How to use Django HStore DictionaryField in schema and schemaless mode at the same time?
当我在不传递参数的 Django 模型中使用 hstore.DictionaryField()
并在 Djano 管理中注册我的模型时,我可以在管理界面中即时创建新的键值行。
当我在模式模式下使用相同的字段时 hstore.DictionaryField(schema=['some schema description'])
我得到 schema
参数中描述的固定数量的字段。
我能否同时拥有这两个功能,即在架构描述中列出特定类型的多个固定字段,同时还能够添加新字段?
更新
解决这个问题的一种方法是使用 two DictionaryField 的一个有模式,另一个是无模式的,但这不是最佳解决方案。
答案是否定的,您不能同时使用 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)
您可以看到,如果设置了架构,则该字段的可编辑参数将设置为 false,这是 Django 管理员查看的内容,以查看您是否应该被允许编辑管理员中的值 UI。
不幸的是,您只有几个选择:通过创建自己的 class 继承自那个选项来自己覆盖它,或者在他们的 github 页面上打开拉取请求或问题并希望有人会得到它。
当我在不传递参数的 Django 模型中使用 hstore.DictionaryField()
并在 Djano 管理中注册我的模型时,我可以在管理界面中即时创建新的键值行。
当我在模式模式下使用相同的字段时 hstore.DictionaryField(schema=['some schema description'])
我得到 schema
参数中描述的固定数量的字段。
我能否同时拥有这两个功能,即在架构描述中列出特定类型的多个固定字段,同时还能够添加新字段?
更新
解决这个问题的一种方法是使用 two DictionaryField 的一个有模式,另一个是无模式的,但这不是最佳解决方案。
答案是否定的,您不能同时使用 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)
您可以看到,如果设置了架构,则该字段的可编辑参数将设置为 false,这是 Django 管理员查看的内容,以查看您是否应该被允许编辑管理员中的值 UI。
不幸的是,您只有几个选择:通过创建自己的 class 继承自那个选项来自己覆盖它,或者在他们的 github 页面上打开拉取请求或问题并希望有人会得到它。