【问题标题】:DRF serializer get liked data with post by request userDRF 序列化程序通过请求用户获取喜欢的数据
【发布时间】:2017-02-17 10:36:14
【问题描述】:

我正在制作像 facebook 这样的社交应用。 在获取帖子(在新闻提要)数据时,如果我按喜欢该帖子,我想获得布尔值。

models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Post(models.Model):
    uploader = models.ForeignKey(User)
    likes = models.IntegerField(default=0)
    point = models.IntegerField(default=0)
    isPointReceived = models.BooleanField(default=False)

    content = models.TextField()
    uploadedTime = models.DateTimeField(auto_now=True)
    # editedTime = models.DateTimeField()
    def __str__(self):
        return ("[uploader = " + self.uploader.username + "]") + (", [id = " + (str)(self.id) + "]") + ("[content = " + self.content[:50] + "]")


class PostLike(models.Model):
    post = models.ForeignKey(Post, related_name='postLikes')
    liker = models.ForeignKey(User)
    def __str__(self):
        return "Like" + "| [Post = " + (str)(self.post) + "]" + ", [Liker = " + self.liker.username + "]"

序列化器.py

class PostLikeSerializer(serializers.ModelSerializer):
    class Meta:
        model = PostLike
        fields = '__all__'


class PostListSerializer(serializers.ModelSerializer):
    uploader = UserDetailSerializer()
    isMine = serializers.SerializerMethodField()
    isLiked = serializers.SerializerMethodField()
    postComments = PostCommentSerializer(many=True, allow_null=True)
    class Meta:
        model = Post
        fields = ('uploader', 'id',  'likes', 'point', 'isPointReceived', 'content', 'uploadedTime', 'postComments', 'isMine', 'isLiked',)


    def get_isMine(self, obj):
        requestUser = CurrentUserDefault()
        return obj.objects.fileter(uploader=requestUser).exists()
        # return obj.filter(uploader=requestUser)


    def get_isLiked(self, obj):
        requestUser = CurrentUserDefault()
        return PostLike.objects.filter(post=obj, liker=requestUser).exists()
        #
        # try:
        #     PostLike.objects.get(post=obj, liker=requestUser)
        #     return True
        # except:
        #     return False

我尝试了很多肮脏的东西。但没有解决方案..

结论: 如果用户有 PostLike(post=post, user=user) 的记录,则 HTF 来获取相关数据

  • 如何在序列化程序类中获取用户。

或者我应该以不同的方式解决这个问题? 比如在 APIView 中管理喜欢的数据等等……

帮助!

========已编辑========== 最终代码应如下所示。 在serialziers.py中

class PostListSerializer(serializers.ModelSerializer):
    uploader = UserDetailSerializer()
    postComments = PostCommentSerializer(many=True, allow_null=True)
    postLikes = PostLikeSerializer(many=True, allow_null=True)
    postImages = PostImageSerializer(many=True, allow_null=True)
    isMine = serializers.SerializerMethodField()
    isLiked = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ('uploader', 'id',  'likes', 'content', 'uploadedTime', 'postComments', 'postLikes', 'postImages', 'isMine', 'isLiked',)


    def get_isMine(self, obj):
        requestUser = self.context['request'].user
        return obj.uploader == requestUser


    def get_isLiked(self, obj):
        requestUser = self.context['request'].user
        return PostLike.objects.filter(post=obj, liker=requestUser).exists()

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以在序列化方法中从序列化上下文中获取用户:

    self.context['request'].user
    

    它从一个方法get_serializer_context 传递而来,该方法最初是在GenericAPIView 中创建的:

    class GenericAPIView(APIView):
        ....
        def get_serializer_context(self):
            """
            Extra context provided to the serializer class.
            """
            return {
                'request': self.request,
                'format': self.format_kwarg,
                'view': self
            }
    

    如您所见,您还可以从上下文中获取 formatview。你也可以重写这个方法来设置额外的上下文。

    【讨论】:

      【解决方案2】:
      def get_isLiked(self, obj):
          requestUser = self.context['request'].user
          return PostLike.objects.filter(post=obj, liker=requestUser).exists()
      

      如果结果有 12 个对象,它将执行 12 个类似的查询,这会增加您的响应时间。我正在寻找解决方案,以便我可以通过一个查询来完成。不知道我该怎么做。

      【讨论】:

      • 是的。这增加了请求响应时间.. 甚至我也在寻找一种方法来克服这个问题。你有什么线索吗?
      猜你喜欢
      • 1970-01-01
      • 2022-10-30
      • 1970-01-01
      • 2011-04-06
      • 2021-10-28
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多