- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的应用程序中,有一个模型将配置存储在其字段之一中。该字段定义为 JSONField
。我有一个严格的结构来定义该字段的内容应该是什么样子,但我正在努力寻找一种方法来序列化它以验证 API 请求中的数据。
目前有效但不验证 config_field
内部内容的解决方案是盲目接受任何符合 json
对象的内容:
我的模型的简化版本:
class MyModel(models.Model):
config_field = JSONField(...)
...
为了解决这个问题,这里有一个存储在 config_field
中的数据结构的简化版本:
{"some_config_int": 42, "some_config_vars": [{"id": 1}, {"id": 2}]}
这是我的序列化器的简化版本:
class MyModelSerializer(serializers.ModelSerializer):
config_field = serializers.JSONField(required=False)
class Meta:
model = MyModel
fields = ('config_field', ...)
我想要实现的是为 config_field
内部内容的嵌套表示( reference to DRF documentation )提供一个序列化器。到目前为止我尝试过的(但不起作用):
class ConfigVarsSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
class ConfigFieldsSerializer(serializers.Serializer):
some_config_int = serializers.IntegerField(required=True)
some_config_vars = serializers.ListField(child=ConfigVarsSerializer,required=True)
class MyModelSerializer(serializers.ModelSerializer):
config_field = ConfigFieldsSerializer(required=False)
class Meta:
model = MyModel
fields = ('config_field', ...)
这样,可以选择 POST/PUT 具有配置的对象,但如果 config_field
位于请求正文中,则应提供整个嵌套对象。
最佳答案
在尝试了几种可能的解决方案之后,我想指出 2 个最简单且最重要的解决方案,它们不需要覆盖 create
两者都没有的方法MyModelSerializer
也不是内部序列化器:
config_field
的字段验证方法在MyModelSerializer
validate
MyModelSerializer
序列化整个对象的方法代表 config_field
内部内容的序列化器两种解决方案都是相同的:
class ConfigVarsSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
class ConfigFieldsSerializer(serializers.Serializer):
some_config_int = serializers.IntegerField(required=True)
some_config_vars = serializers.ConfigVarsSerializer(required=True, many=True)
<小时/>Note that
some_config_vars
stores list of objects, that's whymany=True
.
覆盖 config_field
的字段验证方法在MyModelSerializer
。在给定示例的情况下,序列化器的最终代码将是:
class MyModelSerializer(serializers.ModelSerializer):
config_field = JSONField(required=False)
class Meta:
model = MyModel
fields = ('config_field', ...)
def validate_config_field(self, value):
serializer = ConfigFieldsSerializer(data=value)
serializer.is_valid(raise_exception=True)
return value
此方法首先验证 config_field
使用默认JSONFieldSerializer
如果内容不是有效的 JSON
,则会引发异常目的。
如果JSONFieldSerializer
也不异常(exception) validate_custom_fields
被调用并将字段内容传递到 ConfigFieldsSerializer
并验证其自身和所有嵌套序列化器的所有内容。
覆盖validate
MyModelSerializer
序列化整个对象的方法。在给定示例的情况下,序列化器的最终代码将是:
class MyModelSerializer(serializers.ModelSerializer):
config_field = JSONField(required=False)
class Meta:
model = MyModel
fields = ('config_field', ...)
def validate(self, attrs):
config_field = attrs.get('config_field')
if config_field:
serializer = ConfigFieldsSerializer(data=config_field)
serializer.is_valid(raise_exception=True)
return attrs
这种方法需要更多的代码,但允许结合 config_field
的验证与其他相关领域。
关于python - JSONField 嵌套表示的序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56025763/
问题 设置 JSONField 的最佳方法是什么?在 django 中拥有新列表的默认值? 上下文 有一个模型,其中一个字段是项目列表。在没有项目集的情况下,模型应该有一个空列表。 当前解决方案 fr
我有一个使用 bradjasper 的 django-jsonfield 的 Postgres 9.4/Django 1.8 数据库包裹。 (参见 https://github.com/bradjas
我想过滤一个 JSONField my_field,其中 JSON 不为空。在文档中有 has_key 和 has_any_key 方法,但我事先不知道可能的 key 。在 SQL 中它应该是这样的:
我的课是这样的: class Foo(models.Model): known_by = JSONField() 我的数据看起来像这样 { "known_by" : [
class Blog: values = JSONField(blank=True, default=list) [ { "id": 1, "value": "31" }
我在 Django 的模型上有一个 JSONField,称为 metadata。 该字段中的数据可能看起来像这样 { "vis": { "plots": [
我有一个 jsonfield foo = JSONField(default=list) 我想过滤查询集,以便 foo 有一些数据(不是空列表) 我试过了 MyModel.objects.filter
是否可以使用ILIKE(包含)运算符在词典列表中搜索一个键值?我的json字段看起来像这样: object = MyModel() object.json_data = [ {
使用 JSONField 时,内容会在读取值时自动从 JSON 解码为 python 对象。我有一个用例,我将字符串编码回 JSON 以嵌入到模板中。有什么方法可以从对象中获取原始 JSON 字符串吗
我们一直在使用来自 jsonfield 的 JSONField图书馆一段时间,但现在我们想使用 native PostgreSQL JSONField .所以我想知道是否可以更改现有模型的字段类型,保
我有这个模型: class InventoryItem(models.Model): size_range = JSONField(null=True) # JSONField in Dja
我从 Django 的文档中获取了以下示例,除了替换添加了一个键 '99': >>> Dog.objects.create(name='Rufus', data={ ... 'breed': 'lab
在我的应用程序中,有一个模型将配置存储在其字段之一中。该字段定义为 JSONField。我有一个严格的结构来定义该字段的内容应该是什么样子,但我正在努力寻找一种方法来序列化它以验证 API 请求中的数
我已经搜索了几天,试图找到一种 DRY 方法,使用 django 的内置验证和表单呈现从 JsonField 创建动态表单。我还没有找到一个包含 django 验证和渲染的解决方案,所以我想为此创建一
我通过使用 JSONField 在 mysql 中创建了一个 TextField (django) 类型的表。这就是我的模型的样子 from django.db import models from
我的模型中有一个 Json 字段 - class Product(models.Model): ... detailed_stock = JSONField(loa
这是模型: class ModelA(models.Model): field1 = models.CharField(max_length=100) field2 = models.
我正在尝试使用 Django + MySQL 为我的模型实现自定义 JSON 字段。这就是我的 models.py 的样子: from __future__ import unicode_litera
数据库是postgres 9.4在我的表中,我使用的是 JSONField class Item(models.Model): item = models.CharField(max_leng
对于经验丰富的 (Django) 开发人员来说,这可能是一个简单的问题。 我的项目的数据库是PostgreSQL。 我打算使用单个 protected 模型实例作为某些数据的集中存储。该实例将有一个
我是一名优秀的程序员,十分优秀!