我有一个
JSONField
在我的模型中存储一些配置数据。我想访问这个字段(读和写),能够对内部字段及其值进行部分更新。
为了示例的目的,让一个模型被调用
MyModel
具有
杰森菲尔德
打电话
config
:
class MyModel(models.Model):
config = JSONField(default=dict())
...
我创建了一个单独的
ViewSet
访问存储在
配置
字段。假定
user
模型具有
ForeignKey
关系
MyMa模型
. 这个的简化版本
视图集
是:
class ConfigurationFieldViewSet(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
serializer_class = MyModelConfigurationSerializer
def get_object(self):
return self.request.user.my_model
数据存储在
配置
有一个特定的结构和几个可能的内部对象:
{
"C1": {"counter": 42, "active": false},
"C2": {"counter": 13, "active": true}
}
访问并正确序列化
MyMa模型
实例在所有嵌套级别我都为每个字段级别创建了序列化程序。入盟
配置
在领域
MyMa模型
我正在使用这个序列化程序:
class MyModelConfigurationSerializer(serializers.ModelSerializer):
configuration = ConfigurationFieldSerializer(required=True)
class Meta:
model = MyModel
fields = ('configuration',)
访问和序列化的第一层
configuration
字段有第二个序列化程序:
class ConfigurationFieldSerializer(serializers.Serializer):
C1 = BaseConfigurationSerializer(required=True)
C2 = BaseConfigurationSerializer(required=True)
最后访问每个
C1
和
C2
字段有第三个序列化程序:
class BaseConfigurationSerializer(serializers.Serializer):
counter = serializers.IntegerField(
required=False,
help_text=_('Some integer field help text')
)
active = serializers.BooleanField(
required=False,
help_text=_('Some boolean field description')
)
上面的代码非常适合读取存储在
配置
字段并正确序列化其内部对象。当我试图执行
PUT
在这个领域。
如果我超驰
update
方法级别
MyModelConfigurationSerializer
,然后序列化程序验证我提交的数据,但作为一个块,我只能一次性保存所有数据。如果我试图提交一些内部字段,内部序列化程序仍然会正确地接收验证错误。
def update(self, instance, validated_data):
instance.configuration = validated_data.get(
'configuration', instance.configuration
)
instance.save()
return instance
但我不能做的是打电话
更新
内部序列化程序的方法(
ConfigurationFieldSerializer
和
BaseConfigurationSerializer
在这种情况下):如果我实现它们
更新
方法,它们根本不会被调用。
根据
DRF Documentation
可写的嵌套表示是可能的,并且对应
更新
或
create
方法应该在
更新
在顶级序列化程序上调用。