DRF 序列化程序通过请求用户通过 post 获取喜欢的数据

uzu*_*uzu 5 django django-rest-framework

我正在制作一个像 facebook 这样的社交应用程序。当获取帖子(在新闻提要)数据时,如果我按下那个帖子,我想得到布尔值。

模型.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 + "]"
Run Code Online (Sandbox Code Playgroud)

序列化程序.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
Run Code Online (Sandbox Code Playgroud)

我试过很多脏东西。但没有解决方案..

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

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

或者我应该以不同的方式解决这个问题?就像在 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()
Run Code Online (Sandbox Code Playgroud)

Iva*_*kin 3

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

self.context['request'].user
Run Code Online (Sandbox Code Playgroud)

get_serializer_context它是从最初在 a 中创建的方法传递的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
        }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您也可以从上下文中获取formatview。您还可以重写此方法来设置附加上下文。