为Django Rest框架创建一个 "喜欢 "的url/button[英] Creating a "like" url/button for Django Rest Framework

本文是小编为大家收集整理的关于为Django Rest框架创建一个 "喜欢 "的url/button的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我正在开发一个用于 iPhone 应用的 API.为了喜欢一张图片,我假设我需要在我的序列化程序中嵌入一个 url,它可以用来给一张照片添加一个喜欢.有人可以帮我实现吗?

我可以查看网址,但我不确定如何将照片的 ID 传递给视图.这是我到目前为止所得到的:

views.py:

@api_view(['POST'])
def like_create_api(request, photo_id):
    serializer = PhotoSerializer(data=request.DATA)
    if serializer.is_valid():
        serializer.object.content_object = get_object_or_404(Photo, id=photo_id)
        serializer.object.likers.add(request.user)
        serializer.save()
        return RestResponse(serializer.data, status=status.HTTP_201_CREATED)
    return RestResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py:

class PhotoSerializer(serializers.ModelSerializer):
    likers = serializers.HyperlinkedRelatedField(
        many=True, view_name='user_account_detail_api', read_only=True,
        lookup_field='username')
    like_url = LikeUrlField("like_create_api")

    class Meta:
        model = Photo
        fields = ['like_url', 'id', 'slug', 'photo', 'likers']

models.py:

class Photo(HashtagMixin, TimeStampedModel):
    category = models.ForeignKey("Category")
    creator = models.ForeignKey(settings.AUTH_USER_MODEL)
    likers = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                    related_name='likers', blank=True)
    photo = models.ImageField(upload_to=upload_location)
    slug = models.SlugField()

    class Meta:
        app_label = 'photos'

    def __unicode__(self):
        return u"{}".format(self.slug)

urls.py:

url(r'^like/$', 'api.views.like_create_api',
        name='like_create_api'),

感谢任何帮助.提前谢谢!

推荐答案

您不需要使用序列化器进行验证,只需保存like 关系即可.

@api_view(['POST'])
def like_create_api(request, photo_id):
    photo = get_object_or_404(Photo.objects.all(), pk=photo_id)
    photo.likers.add(request.user)
    serializer = PhotoSerializer(photo)
    return Response(serializer.data, status=status.HTTP_201_CREATED)

本文地址:https://www.itbaoku.cn/post/1937772.html

问题描述

I'm working on an API to use for an iPhone app. In order to like a picture, I'm assuming I need to embed a url in my serializer that can be used to add a like to a photo. Could someone please help me implement this?

I am able to view the url, but I'm not sure how to pass the photo's id to the view. This is where I've gotten so far:

views.py:

@api_view(['POST'])
def like_create_api(request, photo_id):
    serializer = PhotoSerializer(data=request.DATA)
    if serializer.is_valid():
        serializer.object.content_object = get_object_or_404(Photo, id=photo_id)
        serializer.object.likers.add(request.user)
        serializer.save()
        return RestResponse(serializer.data, status=status.HTTP_201_CREATED)
    return RestResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py:

class PhotoSerializer(serializers.ModelSerializer):
    likers = serializers.HyperlinkedRelatedField(
        many=True, view_name='user_account_detail_api', read_only=True,
        lookup_field='username')
    like_url = LikeUrlField("like_create_api")

    class Meta:
        model = Photo
        fields = ['like_url', 'id', 'slug', 'photo', 'likers']

models.py:

class Photo(HashtagMixin, TimeStampedModel):
    category = models.ForeignKey("Category")
    creator = models.ForeignKey(settings.AUTH_USER_MODEL)
    likers = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                    related_name='likers', blank=True)
    photo = models.ImageField(upload_to=upload_location)
    slug = models.SlugField()

    class Meta:
        app_label = 'photos'

    def __unicode__(self):
        return u"{}".format(self.slug)

urls.py:

url(r'^like/$', 'api.views.like_create_api',
        name='like_create_api'),

Any help is appreciated. Thank you in advance!

推荐答案

You don't need to use a serializer for validation just save the like relation.

@api_view(['POST'])
def like_create_api(request, photo_id):
    photo = get_object_or_404(Photo.objects.all(), pk=photo_id)
    photo.likers.add(request.user)
    serializer = PhotoSerializer(photo)
    return Response(serializer.data, status=status.HTTP_201_CREATED)