【发布时间】:2015-07-27 16:35:11
【问题描述】:
我正在通过 Django Rest Framework 在移动应用程序 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 以限制用户喜欢他已经喜欢的播放列表。
我的看法:
class LikesView(viewsets.ModelViewSet):
queryset = PlaylistLikes.objects.all()
serializer_class = LikesSerializer
filter_backends = (filters.OrderingFilter, filters.DjangoFilterBackend, filters.SearchFilter)
filter_class = LikesFilter
search_fields = ('playlist', 'user',)
def create(self, request, *args, **kwargs):
user = request.user
request.data['user'] = user.pk
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
return Response(serializer.data, status=status.HTTP_201_CREATED)
@detail_route(methods=['put'])
def put(self, request, *args, **kwargs):
user = request.user
request.data['user'] = user.pk
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data, status=status.HTTP_200_OK)
和序列化器:
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 = 19,user = 3,like = 1。 Like 已成功创建。
与相同的播放列表不同,我发送 PUT 方法,正文为:playlist = 19,user = 3,但出现以下错误:
“non_field_errors”:[ “字段用户,播放列表必须设置唯一。” ]
我知道这是因为模型中的unique_together 而发生的。但我没有创建具有相同user 和playlist 的新记录。我只想更新现有记录。为什么会发生这种情况以及如何解决这个问题?
【问题讨论】:
-
嗯...我发现我可以在播放列表被喜欢时返回 Id (
fields = ('id', 'user', 'playlist', 'like'))。我们决定不更新记录,而只是删除它。因此,正在构建移动应用程序的人可以使用此 ID 来不同于播放列表。他只是将DELETE方法发送到/api/likes/*like_id*。
标签: python django api django-rest-framework