Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在ForeignKey关系中使用的ModelManager_Python_Django_Django Models_Django Queryset_Django Managers - Fatal编程技术网

Python 在ForeignKey关系中使用的ModelManager

Python 在ForeignKey关系中使用的ModelManager,python,django,django-models,django-queryset,django-managers,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

我在我的网站上使用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对象时,它完全按照我所希望的方式工作,但当它们通过一个与Account对象有ForeignKey关系的对象引用时,它就不起作用了。例如,如果我有一个注释模型,如下所示:

class Comment(models.Model):
    author = models.ForeignKey(Account)
我希望,当我查询注释对象时,其作者是非活动用户(即帐户模型的默认管理员不会返回的用户)的对象也不会返回,而不是返回注释但表示与之相关的帐户不存在的当前行为

没有在Comment类上专门定义自定义ModelManager,有什么方法可以实现这一点吗?因为我想在很多与Account one相关的课程中实现这一点,我想不出一种不重复的方法


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

在您的案例中,它应该已经起作用了,正如文档()所说:

默认管理器

如果使用自定义管理器对象,请注意第一个管理器 Django遭遇(按照模型中定义的顺序) 有特殊的地位。Django解释在 类作为“默认”管理器,以及Django的几个部分(包括 dumpdata)将专门为该模型使用该管理器。作为一个 因此,在选择默认值时要小心是个好主意 管理器,以避免覆盖get_queryset()的情况 导致无法检索您想要使用的对象

由于ActiveAccountsManager声明是模型中的第一个声明,因此应该已经将其标记为“默认”声明


如果您要更新到Django>=1.10,您可以为您的模型显式设置默认管理器(请参阅)。

它应该已经在您的情况下起作用,如文档()所述:

默认管理器

如果使用自定义管理器对象,请注意第一个管理器 Django遭遇(按照模型中定义的顺序) 有特殊的地位。Django解释在 类作为“默认”管理器,以及Django的几个部分(包括 dumpdata)将专门为该模型使用该管理器。作为一个 因此,在选择默认值时要小心是个好主意 管理器,以避免覆盖get_queryset()的情况 导致无法检索您想要使用的对象

由于ActiveAccountsManager声明是模型中的第一个声明,因此应该已经将其标记为“默认”声明

如果要更新到Django>=1.10,则可以显式设置模型的默认管理器(请参阅)