【问题标题】:Creating a "like" url/button for Django Rest Framework为 Django Rest Framework 创建一个“喜欢”的 url/按钮
【发布时间】:2016-02-26 07:54:12
【问题描述】:

我正在开发一个用于 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'),

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

【问题讨论】:

    标签: django api serialization django-views django-rest-framework


    【解决方案1】:

    您不需要使用序列化程序进行验证,只需保存类似关系即可。

    @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)
    

    【讨论】:

      【解决方案2】:

      您是指网址中的(?P<photo_id>\d+)/$ 吗?

      类似这样的:

      url(r'^like/(?P<photo_id>\d+)/$', 'api.views.like_create_api',
          name='like_create_api'),
      

      UP:如果你需要获取 post form 参数(request.POST.get('photo_id', ''))那么你的视图必须是这样的:

      @api_view(['POST'])
      def like_create_api(request):
          ...
              serializer.object.content_object = get_object_or_404(Photo,
                  id=request.POST.get('photo_id', ''))
          ...
      

      【讨论】:

      • 我在尝试发布数据时收到此错误:"detail": "JSON parse error - No JSON object could be decoded"。有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2012-09-20
      • 2020-11-04
      相关资源
      最近更新 更多