我正在使用 Django REST 框架开发 API。就我而言,我使用嵌套序列化器
所以我需要覆盖.update
method.
这是所需的描述:
序列化器
配置串行器
class DeviceConfigSerializer(serializers.ModelSerializer):
config = serializers.JSONField()
context = serializers.JSONField()
class Meta:
model = Config
fields = ['backend', 'status', 'templates', 'context', 'config']
设备详细信息串行器
class DeviceDetailSerializer(serializers.ModelSerializer):
config = DeviceConfigSerializer()
class Meta(BaseMeta):
model = Device
fields = [
'id',
'name',
'organization',
'mac_address',
'key',
'last_ip',
'management_ip',
'model',
'os',
'system',
'notes',
'config',
]
def update(self, instance, validated_data):
config_data = None
if self.data['config'] is None and validated_data.get('config'):
config_data_ = dict(validated_data.get('config'))
config_templates = config_data_.pop('templates')
config = Config.objects.create(device=instance, **config_data_)
for template in config_templates:
config.templates.add(template.pk)
if validated_data.get('config'):
config_data = validated_data.pop('config')
# When config data is provided with PATCH requests
if config_data:
instance.config.backend = config_data.get(
'backend', instance.config.backend
)
instance.config.status = config_data.get('status', instance.config.status)
config_templates = config_data.get('templates')
instance.config.templates.clear()
for template in config_templates:
instance.config.templates.add(template.pk)
instance.config.context = json.loads(
json.dumps(config_data.get('context')),
object_pairs_hook=collections.OrderedDict,
)
instance.config.config = json.loads(
json.dumps(config_data.get('config')),
object_pairs_hook=collections.OrderedDict,
)
instance.config.save()
return super().update(instance, validated_data)
设备详细信息视图
class DeviceDetailView(RetrieveUpdateDestroyAPIView):
serializer_class = DeviceDetailSerializer
queryset = Device.objects.all()
现在,当我向其端点发送 PUT/PATCH 请求时,它工作正常并且数据库中的字段得到更新,但由于 PUT/PATCH 请求成功完成后,我应该在响应中返回更新的实例字段,但是就我而言,我需要再次发送 GET 请求/或刷新页面以获取可浏览 API 中的更新数据。
还有什么我需要补充的吗,还是我遗漏了什么?