You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效筛选未被指定用户查看的Django多对多查询集

如何高效筛选未被特定用户查看的Django通知?

你当前的查询逻辑存在问题:filter(seen_users__in=[])是筛选完全没有任何用户读过的通知,而非当前用户未读的通知——只要有其他用户读过这条通知,就会被错误排除,不符合需求。

正确的思路是直接排除当前用户已读的通知,剩下的自然就是当前用户未读的内容(包括还没人读过的通知),用Django ORM的exclude方法就能高效实现:

修正后的代码如下(顺便修正了authentication_classess的拼写错误,多了一个s):

from django.contrib.auth import get_user_model
from rest_framework import generics
from rest_framework.authentication import TokenAuthentication

User = get_user_model()

class Notification(models.Model):
    title = models.CharField(max_length=255)
    seen_users = models.ManyToManyField(User, blank=True)

class NotificationView(generics.ListAPIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = []

    def get_queryset(self):
        unseen_only = self.request.GET.get("unseen_only", "0")
        current_user = self.request.user
        if unseen_only == "1":
            # 排除当前用户已读的通知,剩下的就是未读内容
            return Notification.objects.exclude(seen_users=current_user)
        return Notification.objects.all()

为什么这个方法高效?

Django ORM会将exclude(seen_users=current_user)转换为优化后的SQL查询(通常是NOT EXISTS或左连接过滤),直接在数据库层面完成筛选,无需加载所有通知后在内存中二次处理,性能更优。

内容的提问来源于stack exchange,提问作者AbbasEbadian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:42:09