【问题标题】:Queryset Cannot reorder a query once a slice has been taken查询集一旦获取切片就无法重新排序查询
【发布时间】:2013-11-28 16:13:17
【问题描述】:

我在使用 Django 中的查询集时遇到了一些问题。不幸的是,我不能使用内置分页的 Django REST 框架,因为它添加了诸如“下一个”、“上一个”和“计数”之类的未处理的 JSON 字段,所以我想限制在查询集上使用 [: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],为什么会出现此错误,但既然我是在之后执行此操作,为什么会出现此错误?

谢谢, 标记

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    此错误发生在 get_queryset 返回查询集后,因为 LocationViewSet 具有尝试再次对查询集重新排序的“排序”属性。

    【讨论】:

      【解决方案2】:

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

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

      在原始查询中保留一件事,您必须始终获取表的主键,这是强制性的。这里organization_idcontact_organization表的主键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        • 2010-10-30
        • 2015-10-26
        • 2011-05-16
        • 1970-01-01
        • 2021-03-05
        • 2021-08-17
        相关资源
        最近更新 更多