我在我的网站上使用Django 1.9,我需要一种完全忽略非活动用户的有效方法,因此我不会向他们发送任何通知,电子邮件等。
我尝试使用只返回活动模型的自定义模型管理器,如下所示:
class ActiveAccountsManager(models.Manager):
use_for_related_fields = True
def get_queryset(self):
return super(ActiveAccountsManager, self).get_queryset().filter(user__is_active=True)
class Account(models.Model):
class Meta:
verbose_name = _('Account')
verbose_name_plural = _('Accounts')
objects = ActiveAccountsManager()
all_accounts = models.Manager() # Enabling the obtention of all the users, instead of only the active ones
user = models.OneToOneField(User)
type = models.IntegerField(choices=ACCOUNT_TYPES, default=-1)
而且,虽然当我直接尝试查询Account对象时它完全按照我想要的方式工作,但是当它们通过与它具有ForeignKey关系的对象引用时它不会。例如,如果我有一个如下所示的评论模型:
class Comment(models.Model):
author = models.ForeignKey(Account)
我想这样,当我查询Comment对象时,也不会返回其作者是非活动用户的那些用户(即帐户模型的默认管理员不会返回的用户),而不是当前行为返回评论但表示与其相关的帐户不存在
如果没有在Comment类上专门定义自定义ModelManager,有没有办法实现这个目的?因为我想在很多与账户相关的课程中实现这一点,我不会想到一种方法,而不是非常重复。
请不要犹豫,询问我的问题的任何部分是否不够清楚,或者我是否需要提供有关我的代码的更多详细信息。非常感谢你。
答案 0 :(得分:0)
它应该已经适用于您的情况,因为文档(https://docs.djangoproject.com/en/1.9/topics/db/managers/#default-managers)说:
默认管理员
如果您使用自定义管理器对象,请注意第一个管理器 Django遇到(按照模型中定义的顺序) 有特殊的地位。 Django解释了a中定义的第一个Manager class作为“默认”管理器,以及Django的几个部分(包括 dumpdata)将专门为该模型使用该Manager。作为一个 结果,在选择默认值时要小心谨慎 经理为了避免重写get_queryset()的情况 导致无法检索您想要使用的对象。
由于ActiveAccountsManager声明在模型中排在第一位,因此它应该已经标记为“默认”声明。
如果您要更新为Django> = 1.10,您可以明确设置模型的默认管理器(请参阅https://docs.djangoproject.com/en/1.11/ref/models/options/#default-manager-name)。