gpt4 book ai didi

python - 如果由 QuerySet.as_manager() 创建,则修改 Django Manager get_queryset() 方法

转载 作者:太空狗 更新时间:2023-10-30 02:42:07 26 4
gpt4 key购买 nike

我有以下设置:

from django.db import models

class BaseInfoQuerySet(models.query.QuerySet):

def public(self):
return self.filter(public=True)

def not_grouped(self):
return self.filter(bu_group=True)


class BUManager(models.Manager):

def get_queryset(self):
return BaseInfoQuerySet(self.model, using=self._db).extra(
select={'null_group': 'bu_group_id IS NULL'},
order_by=['null_group'])


class BU(models.Model):
# some field definitions

# option 1 (preferred)
objects = BaseInfoQuerySet.as_manager()
# option 2
objects = BUManager()

我正在使用 Django 1.8 和 Python 2.7。

我想要实现的是能够使用 # option 1 但是 BaseInfoQuerySet 中的所有方法都应该使用修改后的 get_queryset() BUManagerBaseInfoQuerySet 用作其他模型的多个查询集的基类,所以我不想摆脱它,只使用 models.Manager。我还希望能够链接 QuerySet 过滤器(例如 BU.objects.public().not_grouped())。

我认为解决方案是以某种方式修改方法 as_manager() 以返回修改后的 Manager 并覆盖 get_queryset 方法。

最佳答案

我使用 Python3 和 Django1.10 对此进行了测试,因为这是我现在可用的环境。让我知道是否需要进行任何更改以使其在您的环境中运行。

您可以在运行时在管理器实例上设置一个新的 get_queryset 方法,如下所示:

import types
from django.db import models

class BaseInfoQuerySet(models.query.QuerySet):

def public(self):
return self.filter(public=True)

def not_grouped(self):
return self.filter(bu_group=True)

@classmethod
def as_manager(cls):

def get_queryset(self):
return BaseInfoQuerySet(self.model, using=self._db).extra(
select={'null_group': 'bu_group_id IS NULL'},
order_by=['null_group'])

manager = super(BaseInfoQuerySet, cls).as_manager()
manager.get_queryset = types.MethodType(get_queryset, manager)
return manager

但这对我来说看起来过于复杂。我最终选择了您的选项 #2。

如果您确实选择了选项 #2,请记住将 QuerySet 的方法克隆到您的管理器上或使用通用的混入。

关于python - 如果由 QuerySet.as_manager() 创建,则修改 Django Manager get_queryset() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37561989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com