Django自定义管理器动态过滤归档对象



假设我有一个模型:

class Car(models.Model):
name = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)

当我查询Car时,我总是想返回满足的对象,is_active=True。为此,在StackOverFlow上搜索,我发现我最好的选择是使用ModelManager,如下所示:

class CarManager(models.ModelManager):
def get_queryset(self):
return super().get_queryset().filter(is_active=True)

并且,在我的模型中使用Manager

class Car(models.Model):
name = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
objects = CarManager()

使用此解决方案总是返回活动的Car查询集。但是,有时我也想返回不活动的Car查询集,而不想编写另一个ModelManager

详细说明,

  1. 当我运行时,

    Car.objects.all((或者,

    Car.objects.filter(名称__contains='Car'(或者,

    Car.objects.filter(is_active=True(

我只想要活动的汽车查询集。

  1. 当我运行时,

    Car.objects.filter(is_active=False(

我想设置不活动的汽车查询集。

而且,我想使用单个ModelManager和默认方法(get、filter、all等(来实现这一点。我之所以想要这个是因为,它已经在很多地方使用过了。

那么,有什么方法可以做到这一点吗?欢迎任何建议或见解。

感谢您提前提供的帮助。

所以,经过长时间的研究和文档和Django源代码,我为filter((方法提出了这个:

class CarManager(models.ModelManager):
def filter(self, *args, **kwargs):
if kwargs.get('is_active') == False:
return super().get_queryset().filter(*args, **kwargs)
return self.get_queryset().filter(*args, **kwargs)

def get_queryset(self):
return super().get_queryset().filter(is_active=True)

在这里,我覆盖了filter((方法,因此:

  1. 如果传递了is_active=False,则调用父级(默认(get_queryset((和filter((
  2. 如果未传递is_active或传递is_active=True,则调用重写的get_queryset((方法(返回活动的Car queryset(,然后调用filter((方法

如果还有其他解决方案或更好的做法,请务必提及。谢谢

恐怕这是不可能的,因为您正在覆盖管理器的基本查询集。您可以实现一个额外的方法来返回一个只有非活动汽车的查询集,而不是创建另一个管理器,比如:

class CarManager(models.ModelManager):
def get_queryset(self):
return super().get_queryset().filter(is_active=True)
def get_inactive_cars(self):
return super().get_queryset().filter(is_active=False)

然后替换检索非活动查询集的查询集:

Car.objects.get_inactive_cars()

最新更新