按注释排序并使用values()而不在Django的ORM中返回注释

时间:2013-12-20 16:46:37

标签: python django django-orm

我正在尝试运行以下查询:

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。有没有办法做到这一点?

2 个答案:

答案 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之前使用valuesdoc中的示例:

  

您还应注意,average_rating已明确包含在要返回的值列表中。这是必需的,因为values()和annotate()子句的排序。

ValuesQuerySet将始终包含annotate字段,它将删除字段

values = labels.order_by('-num_assets')[:20].values('id', 'name')
for value in values:
    value.pop('num_assets')