Django Rest Framework:如何使UpdateAPIView允许增量更新

时间:2015-01-06 15:40:05

标签: django-rest-framework

我有一个数组("朋友"),如下所示,我希望能够追加到。我正在使用常规的UpdateAPIView,但每当我把新朋友PUT / PATCH给#34;朋友"数组,它只用新朋友完全覆盖数组。

{
        "friends": [
            {
                "first_name": "Bob" 
            },
            {
                "first_name": "Jon" 
            }

        ],
       "first_name": "User1", 
}

如何使用UpdateAPIView允许将新项添加到数组中而无需重新发布整个数组。并确保朋友列表中不包含任何重复项?

模型

我实际上使用MongoDB作为我的数据库,但如果你想想我使用mysql / postgres只是忽略使用MongoDB的事实

class UserProfile(Document):
    db_id = IntField()
    email = EmailField()
    first_name = StringField()
    last_name = StringField()
    city = StringField()
    friends = ListField(ReferenceField('self'))

串行器

class UserProfileSerializer(MongoEngineModelSerializer):
    friends = PublicProfileSerializer(many=True, allow_add_remove=True)

    class Meta:
        model = UserProfile
        depth = 1
        exclude = ('db_id',)

  class PublicProfileSerializer(MongoEngineModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('first_name', 'last_name', 'id')

1 个答案:

答案 0 :(得分:0)

正如@norbertpy在评论中提到的,您可以向序列化器添加update方法,以指定您希望如何处理更新(在这种情况下,请确保进行增量更新而不是覆盖更新)现有数据)。已记录在here中。

以下是使用update方法的代码的示例

class UserProfileSerializer(MongoEngineModelSerializer):
    friends = PublicProfileSerializer(many=True, allow_add_remove=True)

    class Meta:
        model = UserProfile
        depth = 1
        exclude = ('db_id',)


class PublicProfileSerializer(MongoEngineModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('first_name', 'last_name', 'id')

    def update(self, user_profile_instance, validated_friend_data):
        user_profile_instance.friends.extend(validated_friend_data)
        user_profile_instance.save()
        return user_profile_instance