如何高效筛选未被指定用户查看的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
相关产品推荐
相关产品推荐

