不允许同时使用唯一的\u更新记录

2024-10-01 00:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正致力于通过Django Rest框架在移动应用程序API中实现Like/Unlike特性。在

所以我有以下模型: 在

class PlaylistLikes(models.Model):
    user = models.ForeignKey(User)
    playlist = models.ForeignKey(Playlist)
    like = models.BooleanField(default=0, blank=True)

    class Meta:
        unique_together = ('user', 'playlist',)
        verbose_name = "Playlist like"
        verbose_name_plural = "Playlist likes"

我添加了unique_together来限制用户喜欢他已经喜欢的播放列表。在

我的观点:

^{pr2}$

和序列化程序:

class LikesSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        like = PlaylistLikes.objects.create(**validated_data)
        playlist = Playlist.objects.get(pk=like.playlist.id)
        playlist.likes_count += 1
        playlist.save()
        return validated_data

    def update(self, instance, validated_data):
        like = PlaylistLikes.objects.get(**validated_data)
        like.like = False
        like.save()
        playlist = Playlist.objects.get(pk=like.playlist.id)
        playlist.likes_count -= 1
        playlist.save()
        return validated_data

    class Meta:
        model = PlaylistLikes
        fields = ('user', 'playlist', 'like')

网址:

router.register(r'likes', views.LikesView, 'likes')

为了喜欢播放列表,我发送了POST方法,主体是playlist = 19user = 3like = 1。喜欢是成功创造的。 与同一个播放列表不同,我发送了PUT方法,其正文为:playlist = 19user = 3,但我得到了以下错误:

"non_field_errors": [ "The fields user, playlist must make a unique set." ]

我知道这是因为模型中的unique_together。但我不会用相同的user和{}创建新记录。我只是想更新现有记录。为什么会这样?如何解决这个问题?在


Tags: datagetobjectsmodels播放列表playlistclasslike
1条回答
网友
1楼 · 发布于 2024-10-01 00:21:34

发生这种情况是因为在PUT方法处理程序中,您在不指定实例的情况下创建了序列化程序:

serializer = self.get_serializer(data=request.data)

请看Serializer.__init__()

^{pr2}$

您没有提供实例参数,它默认为无。在

对于更新,仅当实例属性不是“无”时,才应跳过“唯一的”一起验证:

class UniqueTogetherValidator(object):
    def exclude_current_instance(self, attrs, queryset):
        """
        If an instance is being updated, then do not include
        that instance itself as a uniqueness conflict.
        """
        if self.instance is not None:
            return queryset.exclude(pk=self.instance.pk)
        return queryset

要解决此问题,可以在初始化序列化程序之前移动Userlikes对象的查询:

like = PlaylistLikes.objects.get(**query)
serializer = self.get_serializer(like, data=request.data)

相关问题 更多 >