2017-01-18 41 views
0

我有這樣的模式:使用與用戶匹配的兩個條件之一過濾查詢集。 Django的REST框架

class MessageViewSet(viewsets.ModelViewSet): 
    queryset = Message.objects.all() 
    serializer_class = MessageSerializer 

,當然還有,它返回的每封郵件。

發送消息是這樣的模式:

class Message(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 

    type = models.CharField(_('type'), choices=MESSAGE_TYPE, default='Invitation', max_length=100) 
    content = models.TextField(_('content'), blank=False) 
    sender = models.ForeignKey(User, related_name='sender_message', verbose_name=_("Sender"),) 
    recipient = models.ForeignKey(User, related_name='receiver_message', null=True, blank=True, 
            verbose_name=_("Recipient")) 
    url_profile_image = models.URLField(_('url_profile_image'), max_length=500, blank=True, default='') 

    class Meta: 
     ordering = ('created',) 

和串行是這樣:

class MessageSerializer(serializers.ModelSerializer): 
    sender = serializers.ReadOnlyField(source='sender.uuid') 
    recipient = serializers.ReadOnlyField(source='recipient.uuid') 

    class Meta: 
     model = Message 
     fields = ('url', 'id', 'type', 'content', 'sender', 'recipient', 'url_profile_image') 

只想,如果用戶是發送方或接收方的查詢集返回消息。

我這個嘗試:

filter_backends = filters.DjangoFilterBackend 
filter_fields = ('recipient', 'sender') 

但它不工作,也許,因爲我不知道在哪裏比較。

回答

1

您需要在視圖上定義get_queryset方法,而不是queryset字段。

然後,您可以訪問請求對象以訪問當前用戶。

def get_queryset(self): 
    return Message.objects.filter(Q(recipient=self.request.user) | Q(sender=self.request.user)) 

你可以找到另一個example in the docs for ModelViewSet

+1

不錯。但是我必須讓這個'''queryset = Message.objects.all()'''儘管。不是嗎? 我的意思是,我讓它,它的作品。當我把它拿走時,我得到一個錯誤。 (你知道它爲什麼會發生嗎?) 謝謝! –

+0

@ChuckAguilar - 我不記得在這一刻,我沒有任何消息來源在我面前,所以不記得你收到了什麼錯誤 – Sayse

+0

'''assert queryset不是None,'base_name'參數沒有指定,並且'\ AssertionError:'base_name'參數未指定,並且無法自動確定視圖中的名稱,因爲它沒有'.queryset'屬性。 ''' 但是沒關係,我的意思是,當我讓查詢集像get_query一樣使用get_query函數時,它可以很好地工作。 –

相關問題