Queryset在获取切片后无法对查询重新排序

时间:2013-11-28 16:13:17

标签: python django django-queryset

我在Django中遇到一些查询集问题。不幸的是,我无法使用内置分页的Django REST框架,因为它添加了未打开的JSON字段,例如" next"," previous"和" count",所以我想限制在查询集上使用[:10]选项。

在我的下面尝试中,我收到错误: Queryset Cannot reorder a query once a slice has been taken.

class LocationsViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = serializers.LocationSerializer
    ordering = ('location_name',)

    def get_queryset(self):
        queryset = models.GeonamesLocation.objects.all()
        name_prefix = self.request.QUERY_PARAMS.get('name_prefix', None)
        if name_prefix is not None:
            if len(name_prefix) < 3:
                raise exceptions.ParseError("'name_prefix' must consist of at least 2 characters")
            queryset = queryset.filter(location_name__icontains = name_prefix).order_by('location_name', 'geonames_country', 'geonames_region')[:10]
        return queryset

我理解为什么如果我在执行order_by之前应用[:10],我会收到此错误,但由于我之后正在执行此操作,为什么会给我这个错误?

谢谢, 标记

2 个答案:

答案 0 :(得分:1)

在get_queryset返回queryset之后发生此错误,因为LocationViewSet具有'ordering'属性,该属性尝试再次重新查询查询集。

答案 1 :(得分:0)

您可以在代码中编写10个结果的原始查询,就像它可以工作一样,

org = Organization.objects.raw('SELECT organization_id, name FROM organization where is_active=1 ORDER BY name limit 10')

在原始查询中保留一件事你必须总是获取表的主键,这是必需的。这里organization_idcontact_organization表的主键。