【问题标题】:how to use django Serializer to update an instance如何使用 django Serializer 更新实例
【发布时间】:2021-11-03 08:46:56
【问题描述】:

在 Django PUT 方法中,我想更新一个实例:

sv= SV.objects.get(pk=pk)
serializer = SVSerializer(sv, data=request.data)
if serializer.is_valid():

这里,在request.data中,我只是想传递一些SV的变量。 但是由于缺少某些字段,is_vaild 将是错误的。 我想要的是,只需更新 request.data 中的字段,对于其他字段,将值保留在 sv 中。 我怎么能这样做?

【问题讨论】:

标签: python django serialization request updates


【解决方案1】:

通过设置partial=True执行部分更新:

sv= SV.objects.get(pk=pk)
serializer = SVSerializer(sv, data=request.data, partial=True)
if serializer.is_valid():
    serializer.save()
else:
    # Do something else

这允许PATCH 请求。

编辑

如果您想要在部分更新期间使用默认字段(根据评论中的要求)覆盖 update 方法:

SVSerializer(serializers.ModelSerializer): # Instead of exposing the 
    state_flag = serializers.SlugRelatedField(source='sv_state', queryset=SVState.objects.all(), slug_field='flag')
    
    def update(self, instance, validated_data):
        if self.partial and validated_data.get('state_flag') == None:
            validated_data['state_flag'] = 0
        super().update(instance=instance, validated_data=validated_data)
                

【讨论】:

  • 谢谢。那么在部分序列化器中,我怎样才能将变量初始化为 0? class SVSerializer(serializers.ModelSerializer): # 不要暴露状态的主键,而是使用标志字段 state_flag = serializers.SlugRelatedField(source='sv_state', queryset=SVState.objects.all(), slug_field='flag') 这里,我想在部分Serializer时将state_flag的默认值设置为0。
  • 谢谢。它仍然不起作用。这是错误: django.db.utils.IntegrityError: ('23000', "[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert the value NULL into column 'SV_STATE_KEY', table ' TEST.dbo.SAFETY_VALVE'; 列不允许空值。INSERT 失败。(515) (SQLExecDirectW); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]语句已终止。(3621) ") 调用 validate 时,在调用 update 之前发生了错误。
  • 首先检查您是否按照我的回答设置了partial=True。如果错误仍然存​​在,请更改序列化程序中的 state_flag 字段:state_flag = serializers.SlugRelatedField(source='sv_state', queryset=SVState.objects.all(), slug_field='flag', default=1)
  • 也就是说默认值是1对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2020-10-03
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多