在Django Rest中更新记录

时间:2015-10-29 10:31:57

标签: python django rest django-rest-framework

我正在关注一个Django视频教程并在那里更新模型中的任何记录,他创建了一个视图:

Class UserProfileUpdateDetail(generics.RetrieveUpdateAPIView):
   model = UserProfile

通过上面,他可以获取Mymodel中的任何记录并更新它 例如,通过这个网址 - > / API /用户配置/ 1 /

但是当我在最后使用同样的内容时,我收到此错误 UserProfileUpdateDetail should either include a queryset attribute, or override the get_queryset() method.

我认为可能是因为Django Rest版本?

所以,如果我根据Rest Docs更新我的代码:

class UserProfileUpdateDetail(generics.RetrieveUpdateAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer

然后我可以将任何记录作为e.g., -> /api/UserProfile/1/

获取

但是当我尝试更新时,这条记录不会更新。 LEt说我更新了first_name,但它说用户名已经存在(但它应该更新我提取的相同记录,但我认为它创建新记录)。

我的完整记录:

Models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    subject = models.ManyToManyField('Subjects')
    phone = models.CharField(max_length=20)
    address = models.TextField()

    def __unicode__(self):
        return self.user.username

Serializer.py

class UserProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    # subject = SubjectSerializer(many=True)

    class Meta:
        model = UserProfile
        fields = (
                'user',
                'subject',
                'phone',
                'address',
            )

Views.py

class UserProfileUpdateDetail(generics.RetrieveUpdateAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer

Urls.py

 url(r'^api/user/profile/(?P<pk>[0-9]+)/$', UserProfileUpdateDetail.as_view(), name="user-profile-update"),

1 个答案:

答案 0 :(得分:0)

几位评论:

  • 配置文件序列化程序的方式,它有一个嵌套对象:用户。 DRF不支持嵌套的串行化器,你必须覆盖序列化器上的创建/更新方法,以指定如何处理它们;进一步阅读:http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

  • 我建议设置用户路由和用户序列化程序以包含配置文件序列化程序,而不是序列化配置文件,然后从那里序列化用户。

  • 如果您可以使用它,请为个人资料和用户设置单独的路线;在某些设计中,这很有效,因为您需要比用户定义更频繁地更改配置文件。此外,对于密码重置,您将有一个单独的路由,例如。