我正在尝试运行以下查询:
labels = AssetLabel.objects.filter(organization=request.organization).annotate(num_assets=Count('asset'))
labels = list(labels.order_by('-num_assets')[:20].values('id', 'name'))
这给了我一个错误:
FieldError: Cannot resolve keyword 'num_assets' into field. Choices are: asset, id, name, organization
如果我将num_assets
添加到.values()
,那么我不会收到错误消息。但是,我不希望返回num_assets
。有没有办法做到这一点?
答案 0 :(得分:1)
检查函数extra
,它有一个名为order_by
的参数,因此您可以使用此函数对给定的QuerySet
https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra
我想它可能是这样的:
labels = AssetLabel.objects. \
filter(organization=request.organization). \
extra(
select={'num_assets': "Count('asset')"},
order_by=['num_assets']
)
答案 1 :(得分:0)
您应该在annotate
之前使用values
,doc中的示例:
您还应注意,average_rating已明确包含在要返回的值列表中。这是必需的,因为values()和annotate()子句的排序。
ValuesQuerySet将始终包含annotate字段,它将删除字段
values = labels.order_by('-num_assets')[:20].values('id', 'name')
for value in values:
value.pop('num_assets')