【问题标题】:django rest framework - always INSERTs, never UPDATESdjango rest 框架 - 总是插入,从不更新
【发布时间】:2014-02-20 03:34:20
【问题描述】:

我希望能够通过 POST 更新用户记录。但是,id 始终为 NULL。即使我传递了 id,它似乎也被忽略了

查看代码:

JSON 已发布:

{
    "id": 1, 
    "name": "Craig Champion", 
    "profession": "Developer", 
    "email": "craig@isai.co.uk"
}

@api_view(['POST'])
def get_purchase(request):
    """
    Gets purchase records for a user

    Purchase collection is returned
    """

    user = User();
    serializer = UserSerializer(user, data=request.DATA)

    if serializer.is_valid():

       #The object ALWAYS has ID = nothing at this point

        serializer.save()

        return Response(serializer.data, status=status.HTTP_200_OK)

    else:
        return Response(serializer.errors,   status=status.HTTP_400_BAD_REQUEST)

模型序列化器

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'name', 'profession', 'email', 'password', )
        write_only_fields = ('password' , )

型号

class User(models.Model):
    name = models.CharField(max_length=30, null=True, blank=True)
    profession = models.CharField(max_length=100, null=True, blank=True)
    email = models.EmailField()
    password = models.CharField(max_length=20, null=True, blank=True)


    def __unicode__(self):
        return self.name

如何强制 savechanges 更新并查看 ID?

【问题讨论】:

    标签: python django rest frameworks django-rest-framework


    【解决方案1】:

    您需要使用partial=True 来更新包含部分数据的行:

    serializer = UserSerializer(user, data=request.DATA, partial=True)
    

    来自docs

    默认情况下,序列化程序必须为所有必填字段传递值 否则他们会抛出验证错误。您可以使用 partial 参数 为了允许部分更新。

    【讨论】:

    • 这并不能解决问题。问题是当我初始化 UserSerializer 时,id 没有传递到对象中。它始终是 Nothing(或 null)
    • @ISAIMobile 通过调用User(),您正在创建一个新的用户对象。要更新已经存在的用户,首先使用 User.objects.get 查询获取该用户,然后使用 partial=True 将其传递给序列化程序。
    • 谢谢您,但是如何从 request.DATA 中提取用户的 ID?
    • @ISAIMobile request.DATA['id'] 应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多