Django自定义管理器和queryset缩小了结果范围

Django自定义管理器和queryset缩小了结果范围,django,Django,我希望能够在我的模板中执行以下操作: request.user.notifications.unseen 并向用户显示其所有未看到的通知 到目前为止,根据我在这里找到的一些帖子,我能够开发出以下内容: class NotificationQuerySet(models.QuerySet): def unseen(self): return self.filter(is_read=False) class NotificationManager(models.Mana

我希望能够在我的模板中执行以下操作:

request.user.notifications.unseen
并向用户显示其所有未看到的通知

到目前为止,根据我在这里找到的一些帖子,我能够开发出以下内容:

class NotificationQuerySet(models.QuerySet):
    def unseen(self):
        return self.filter(is_read=False)


class NotificationManager(models.Manager):
    use_for_related_fields = True

    def get_query_set(self):
        return NotificationQuerySet(self.model)

    def unseen(self, *args, **kwargs):
        return self.get_query_set().unseen(*args, **kwargs)
它工作正常,但它显示所有用户发出的所有“未看到”的通知

我的想法是,通过指定对象关系,例如
user.notifications
,将一个参数传递给函数,将结果缩小到请求它的用户

那么,如何将结果缩小到一个用户,而不是所有用户

编辑 型号.py

class UserNotification(models.Model):

    user = models.ForeignKey(User, related_name='notifications')
    advertisement = models.ForeignKey(Advertisement)
    creation_date = models.DateTimeField(editable=False, default=timezone.now)
    notification_type = models.CharField(max_length=3, choices=NOTIFICATION_TYPE)
    is_read = models.BooleanField()

    objects = NotificationManager()
在你看来:

queryset = UserNotifications.objects.unseen(self.request.user)

您可以得到一个查询集,与其他任何查询集一样,可以进一步筛选、使用all()、get()等。向该管理器添加args、kwargs和更多方法,而通用对象管理器不会更改。

你能显示你的通知和用户模型吗?@AhmedHosny我刚做了。我想与其有一个管理器和查询集,不如这样做:
objects=NotificationQuerySet.as_manager()
@AhmedHosny我不想,但我必须使用
上下文处理器
变量来实现这一点。它可以按照我的要求工作。那么为什么不在管理器中过滤它呢,比如:
self.get\u query\u set().filter(is\u read=False)
并删除
get\u query\u set
覆盖?是的,但我想在我的模板中执行此查询,而不是在我的视图中。因此,从用户端使用此管理器,如果您有通知的用户外键,则可以使用user.notification_set(或相关_名称中提供的其他字段)访问通知管理器。django在关系查询中似乎只使用默认的对象管理器。因此,要从用户端使用它,您必须替换对象管理器(编辑答案)。问题是,如果我这样做,我将失去标准管理器,不是吗?不,您将管理器子类化。不可见的方法不会替换任何现有方法(all、get、filter等)
queryset = UserNotifications.objects.unseen(self.request.user)