5

in Django PUT method, I want to update an instance:

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

Here, in request.data, I just want to pass some of the variable of SV. But as some fields missing, the is_vaild will be false. What I want is, just update the fields in request.data, for the other ones, keep the value in sv. How could I do that?

minghang
  • 97
  • 1
  • 1
  • 5
  • 1
    Does this answer your question? [Django Rest Framework update field](https://stackoverflow.com/questions/31173324/django-rest-framework-update-field) – Ankit Tiwari Sep 06 '21 at 08:57

1 Answers1

7

Perform a partial update by setting 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

This allows a PATCH request.

Edit

If you want a default field during partial update (as requested in a comment) override the update method:

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)
                
Alain Bianchini
  • 3,883
  • 1
  • 7
  • 27
  • Thank you. Then in partial Serializer, how could I initialize the variable to 0? class SVSerializer(serializers.ModelSerializer): # Instead of exposing the state's primary key, use the flag field state_flag = serializers.SlugRelatedField(source='sv_state', queryset=SVState.objects.all(), slug_field='flag') Here, I want to set the defaule value of state_flag to 0 when partial Serializer. – minghang Sep 07 '21 at 11:35
  • Thank you. It still does not work. Here is the error: 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'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The statement has been terminated. (3621)") When calling validate, the error happened before calling update. – minghang Sep 07 '21 at 23:46
  • First check that you have set `partial=True` as in my answer. If the error persists, change your `state_flag` field in your serializer: `state_flag = serializers.SlugRelatedField(source='sv_state', queryset=SVState.objects.all(), slug_field='flag', default=1)`. – Alain Bianchini Sep 08 '21 at 05:08
  • That means that default value is 1 right? – minghang Sep 08 '21 at 07:29