0

我正面臨着必須檢查用戶在串行器中登錄的不可避免的情況。它返回登錄的用戶是否有喜歡的帖子無法在序列化程序中使用self.request:任何方式來檢查序列化程序中的登錄用戶?

這裏是PostDetailView。

class PostDetailView(generics.RetrieveAPIView): 
    queryset = Outfit.objects.all() 
    serializer_class = PostDetailSerializer 
    lookup_field = 'pk' 

這是它的串行

class PostDetailSerializer(serializers.ModelSerializer): 
    ... 
    like_count = serializers.SerializerMethodField() 
    liked = serializers.SerializerMethodField() 
    ... 

    class Meta: 
     model = Post 
     fields = (
      ... 
      'like_count', 
      'liked', 
      ... 
     ) 

    def get_liked(self, obj): 
     content_type = obj.get_content_type 
     object_id = obj.id 
     ### Right Here! I can't get self.request.user; 
     my_like = Like.objects.filter_by_instance(obj).filter(user=self.request.user) 

     if my_like == 0: 
      return False 
     return True 

    # this is just an example 
    def get_like_count(self, obj): 
     content_type = obj.get_content_type 
     object_id = obj.id 
     like_count = Like.objects.filter_by_instance(obj).count() 
     return like_count 

由於串行沒有request屬性,我們不能將其導入。我該如何回覆帖子是否被喜歡?

更多信息:我有明確的Like模型來存儲用戶的喜好

class Like(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

    created_at = models.DateTimeField(auto_now=False, auto_now_add=True) 

class Post(models.Model): 
    ... 

也許我可以使用的ModelManager來解決這個問題。但ModelManager也沒有request!無奈... :(

+0

您可以從串行訪問'request'一樣,'self.context ['request']' – zaidfazil

回答

2

你可以做,

def get_liked(self, obj): 
    content_type = obj.get_content_type 
    object_id = obj.id 
    user = self.context['request'].user 
    my_like = Like.objects.filter_by_instance(obj).filter(user=user) 

    if my_like.count() == 0: 
     return False 
    return True 

串行器,現在有request對象在其語境詞典。

+0

完成!它工作正常!我可以在8分鐘內接受這個問題。你能解釋更多關於'context'嗎? –

+1

每個序列化對象都有一個上下文字典,它在初始化時默認保存請求對象。您可以將字面上的任何內容從視圖傳遞到序列化上下文,如'YourSerializer(data = data,context = {' name':'name'})'和'name'可以從序列化程序對象中訪問。 – zaidfazil

相關問題