ForeignKey关系中使用的ModelManager

时间:2017-04-12 11:15:19

标签: python django django-models django-queryset django-managers

我在我的网站上使用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,有没有办法实现这个目的?因为我想在很多与账户相关的课程中实现这一点,我不会想到一种方法,而不是非常重复。

请不要犹豫,询问我的问题的任何部分是否不够清楚,或者我是否需要提供有关我的代码的更多详细信息。非常感谢你。

1 个答案:

答案 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)。