2013-08-26 53 views
1

我试图在应用程序中启用部分更新功能。我扩展了django auth用户模型以允许一些额外的用户数据;当我向视图发送PATCH请求时(扩展为rest_framework.generics.RetrieveUpdateAPIView),会收到正确的数据,但似乎忽略嵌套数据。例如:Django REST Framework深度部分更新

{'id': 1, 'foo': 'bar', 'baz': 'qux', 'user': {'username': 'user1', 'first_name': 'User', 'last_name': 'One'}} 

foobaz正确更新,但usernamefirst_namelast_name都忽略不计。

class UserProfileSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username', 'first_name', 'last_name') 


class UsersSerializer(serializers.ModelSerializer): 
    user = UserProfileSerializer(many=False, read_only=False, partial=True) 

    class Meta: 
     model = Users 
     fields = ('id', 'foo', 'baz', 'yin', 'yang', 'user') 
     depth = 1 


class UserProfileGenericAPIView(generics.GenericAPIView): 
    serializer_class = UsersSerializer 
    queryset = Users.objects.all() 

    def pre_save(self, obj): 
     pass 


class UserProfileView(UserinfoGenericAPIView, generics.RetrieveUpdateAPIView): 
    pass 

有人可以告诉我,如果部分更新甚至支持深度,如果是的话,我可能会做错什么?

回答

1

这是最初在问题中回答的,但我觉得它值得一个体面的解释。

在Django REST Framework 3中,保存嵌套数据的过程已经变得更加清晰。现在,您可以覆盖串行器上的update并操作validated_data,手动更新模型对象。这是specifically documented now,但实施通常非常特定的情况。


原来的答复(在这个问题)由user2708386

简短的回答是肯定的,这是可能的。问题是我仍然需要覆盖模型上的 .save()方法以保存相关的用户对象。

class Users(models.Model): 
    user = models.OneToOneField(User) 
    foo = models.CharField() 
    baz = models.CharField() 
    yin = models.CharField() 
    yang = models.CharField() 

    def save(self, *args, **kwargs): 
     user_ = self.user 
     user_.save(update_fields=('username', 'first_name', 'last_name'), **kwargs) 

     return super(Users, self).save(*args, **kwargs) 
相关问题