Mam problemy z zapytaniem w Django. Niestety nie mogę używać ramy spoczynku Django wbudowanej w paginacji, ponieważ dodaje niezakasane pola JSON, takie jak "Dalej", "Poprzednia" i "Liczba", więc chciałem ograniczyć przy użyciu opcji [: 10] na QuerySet.

W mojej próbie poniżej otrzymuję błąd: 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

Rozumiem, dlaczego otrzymałbym ten błąd, jeśli zastosowałem [:10], zanim zamówiłem_by, ale ponieważ robię to po tym, dlaczego dałbyś mi ten błąd?

Dzięki, Mark.

1
LondonAppDev 28 listopad 2013, 20:13

2 odpowiedzi

Najlepsza odpowiedź

Ten błąd się dzieje po zapytaniu QuerySet jest zwracany przez get_QuerySet, ponieważ LocationViewset ma atrybut "Zamawiający", który próbuje ponownie oder queryset.

1
Bradia 28 listopad 2013, 17:02

Możesz napisać surowe zapytanie dla 10 wyników w takim kodzie, który będzie działać,

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

Zachowaj jedną rzecz w surowym zapytaniu, musisz zawsze pobierać kluczowy klucz stołu, jest obowiązkowy. Tutaj organization_id jest kluczowym kluczem Tabeli contact_organization.

0
Ashish Jain 28 listopad 2013, 17:00