假设我有一个模型:
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。
详细说明,
当我运行时,
Car.objects.all((或者,
Car.objects.filter(名称__contains='Car'(或者,
Car.objects.filter(is_active=True(
我只想要活动的汽车查询集。
当我运行时,
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((方法,因此:
- 如果传递了is_active=False,则调用父级(默认(get_queryset((和filter((
- 如果未传递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()