2017-02-17 55 views
1

我正在做一个社交应用程序,如Facebook。 当我得到帖子(在新闻提要)数据我想要布尔,如果我喜欢那个帖子按下。DRF序列化程序获取喜欢的数据与请求用户发布

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 + "]" 

serializers.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 

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

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

  • 记录如何让用户在序列化器类。

还是我应该以不同的方式来解决这个问题? 喜欢管理喜欢的数据在APIView或任何其他等...

帮助!

======== EDITED ========== 最终的代码应该看起来像这样。 在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() 

回答

0

你可以从串行上下文用户串行方法中:

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 
     } 

self.context['request'].user 

它从一个方法get_serializer_context原本在GenericAPIView创建传递

正如你所看到的,你也可以从上下文中获得formatview。您也可以重写此方法来设置其他上下文。

相关问题