【问题标题】:PUT request using Django serializer使用 Django 序列化程序的 PUT 请求
【发布时间】:2015-11-10 22:20:00
【问题描述】:

我有一个架构,当用户注册时,他/她的设置会被初始化。所以我们需要 GET 和 PUT 来分别获取或更新设置 API 上的设置。

我正在使用 django rest 框架的模型序列化器来存储和获取设置。它在给出响应方面效果很好,但不会将响应保存到模型中。

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)

我得到了预期的响应,但它没有将数据存储在 user_settings 表中,我正在使用 PostgreSql。

【问题讨论】:

  • serializer.save() 返回一个实例。尝试instance = serializer.save() 并检查您在实例中得到了什么。
  • 您正在尝试进行更新?它正在这里创建。
  • 是的,它正在创建,而我只想要每个用户一条记录

标签: django postgresql django-rest-framework serialization


【解决方案1】:

为了让 ModelSerializer 执行更新,您需要将要更新的实例传递给构造函数。

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)

【讨论】:

  • 哦,是的!谢谢。我试图传递作为外键的用户实例。
猜你喜欢
  • 2019-05-06
  • 2019-05-14
  • 1970-01-01
  • 2015-09-10
  • 2017-11-18
  • 2020-02-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多