繁体   English   中英

使用与用户匹配的两个条件之一来过滤查询集。 Django Rest框架

[英]Filter queryset with one of two criteria that match with the user. Django Rest Framework

我有这个模型:

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')

但这可能不起作用,因为我不知道在哪里比较。

您需要在视图集而不是queryset字段上定义get_queryset方法。

然后,您可以访问请求对象以访问当前用户。

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

您可以在文档中找到有关ModelViewSet另一个示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM