【问题标题】:ModelManager used in ForeignKey relations在 ForeignKey 关系中使用的 ModelManager
【发布时间】:2017-09-08 03:27:54
【问题描述】:

我在我的网站上使用 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 关系的对象引用时它不会。例如,如果我有一个像下面这样的 Comment 模型:

class Comment(models.Model):
    author = models.ForeignKey(Account)

我希望,当我查询 Comment 对象时,也不会返回其作者是非活动用户(即 Account 模型的默认 Manager 不会返回的用户)的对象,而不是返回返回评论但表示与其相关的帐户不存在的当前行为

如果没有在 Comment 类上专门定义自定义 ModelManager,是否有任何方法可以实现这一点?因为问题是我想在很多与 Account one 相关的类中实现这一点,而且我想不出一种方法来做到这一点而不会非常重复。

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

【问题讨论】:

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


    【解决方案1】:

    正如文档 (https://docs.djangoproject.com/en/1.9/topics/db/managers/#default-managers) 所说,它应该已经适用于您的情况:

    默认管理员

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

    由于 ActiveAccountsManager 声明首先出现在您的模型中,它应该已经被标记为“默认”声明。

    如果您要更新到 Django >= 1.10,您可以为您的模型显式设置默认管理器(请参阅 https://docs.djangoproject.com/en/1.11/ref/models/options/#default-manager-name)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2010-11-30
      • 2015-03-19
      • 2021-12-20
      • 2013-03-06
      • 2022-08-13
      • 2012-09-29
      相关资源
      最近更新 更多