我在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]
,我会收到此错误,但由于我之后正在执行此操作,为什么会给我这个错误?
谢谢, 标记
答案 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_id
是contact_organization
表的主键。