Shivani Sharma
Shivani Sharma

Reputation: 707

PUT request using Django serializer

I have an architecture in a way that when user registers, his/her settings are initialized. So we need GET and PUT to get or update the settings respectively on settings API.

I am using model serializers of django rest framework for storing and getting the settings. It works well in giving response but it doesn't save that to models.

serializers.py

class UserSettingsSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserSettings
        fields = ('group_notifications', 'updates', 'goal_remind_me', 
                  'goal_days', 'goal_time_interval', 'user')

models.py

class UserSettings(models.Model):

class Meta:
    db_table = 'user_settings'

user = models.ForeignKey('User')
group_notifications = models.BooleanField(default=True)
updates = models.BooleanField(default=False)
goal_remind_me = models.BooleanField(default=False)
goal_days = ListField()
goal_time_interval = models.IntegerField(null=True)

views.py

def settings(request, pk):
    if request.method == 'PUT':
        request.data['user'] = user.id

        serializer = UserSettingsSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            serializer_dict = serializer.data
            serializer_dict["message"] = "Settings updated successfully."
            return Response(serializer_dict, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

I get response as expected but it's not storing data in user_settings table and I am using PostgreSql.

Upvotes: 6

Views: 7680

Answers (1)

Mark Galloway
Mark Galloway

Reputation: 4151

In order for a ModelSerializer to preform an update, you need to pass in the instance that you want updated to the constructor.

def settings(request, pk):
    # query for the UserSettings object
    instance = get_object_or_404(UserSettings.objects.all(), pk=pk)

    if request.method == 'PUT':
        request.data['user'] = user.id

        # pass in the instance we want to update
        serializer = UserSettingsSerializer(instance, data=request.data)

        # validate and update
        if serializer.is_valid():
            serializer.save()
            serializer_dict = serializer.data
            serializer_dict["message"] = "Settings updated successfully."
            return Response(serializer_dict, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

Upvotes: 8

Related Questions