如何在通过相关字段筛选时,应用自定义管理器查询集中的注释和过滤器?以下是一些代码以演示我的意思。
管理器和模型:
尝试使用管理器过滤相关字段
如果你尝试上面的代码,你会得到以下错误:
TypeError: 相关字段收到了无效的查找:some_flag。
进一步澄清一下,基本上相同的问题被报告为一个错误,但没有回应如何实现这个目标:https://code.djangoproject.com/ticket/26393。
我知道可以通过直接在
管理器和模型:
from django.db.models import Value, BooleanField
class OtherModelManager(Manager):
def get_queryset(self):
return super(OtherModelManager, self).get_queryset().annotate(
some_flag=Value(True, output_field=BooleanField())
).filter(
disabled=False
)
class MyModel(Model):
other_model = ForeignKey(OtherModel)
class OtherModel(Model):
disabled = BooleanField()
objects = OtherModelManager()
尝试使用管理器过滤相关字段
# This should only give me MyModel objects with related
# OtherModel objects that have the some_flag annotation
# set to True and disabled=False
my_model = MyModel.objects.filter(some_flag=True)
如果你尝试上面的代码,你会得到以下错误:
TypeError: 相关字段收到了无效的查找:some_flag。
进一步澄清一下,基本上相同的问题被报告为一个错误,但没有回应如何实现这个目标:https://code.djangoproject.com/ticket/26393。
我知道可以通过直接在
MyModel
过滤器中使用管理器的筛选和注释来实现这一点,但关键是要保持DRY,并确保在访问此模型时每个地方都重复这种行为(除非明确指示不这样做)。
SELECT app_mymodel.id,... , True AS "other_model__some_flag" FROM ...
SQL可以通过any_queryset.query.get_compiler('default').as_sql()
轻松验证。也许清楚地解释一下,例如通过SQL,你想得到什么。是的,简化的例子很有用,但经过验证的例子是没有其他无关错误的,例如在def get_queryset
之后缺少return
。 - hynekceramount=F('price')+F('quantity')
(简化版)。正如你所说,聚合是针对一组行进行操作的。 - user1600649.filter()
时不适用于相关模型。 - Ben