Ich arbeite an einem Django-Projekt, in dem ich versuche, alle Produkte mit update_ts
Feld größer als product_sync_ts
von Product
Tabelle vom Server zu einer Zeit, aber da die Anzahl der Produkte ist groß erfordert eine große Menge an Zeit, um alle Daten abzurufen. Ich gebe auch den aktuellen Zeitstempel zusammen mit den Daten zurück. Nun möchte ich die Ergebnisse paginieren.mit Paginierung in Serializer Django
Mein vorheriger Code:
Views.py
@api_view(['GET'])
def productlist(request, format=None):
product_sync_ts = request.GET.get(
'product_sync_ts', None)
if product_sync_ts:
product =Product.objects.filter(
update_ts__gt=product_sync_ts)
)
serializer = SyncedProductSerializer(
instance={'products': product})
return response(serializer.data)
else:
content = {'details': "Bad Request"}
raise APIException400(request, content)
serializer.py
class SyncedProductSerializer(serializers.Serializer):
product_sync_ts = serializers.SerializerMethodField(
method_name='get_current_ts'
)
products = ProductSerializer(many=True, read_only=True)
class Meta:
fields = ('products', 'product_sync_ts')
def get_current_ts(self, obj):
product_sync_ts = datetime.utcnow().isoformat(' ')
return product_sync_ts
class ProductSerializer(serializers.ModelSerializer):
image_url = serializers.SerializerMethodField(
method_name='change_image_url'
)
class Meta:
model = Product
fields = (
'id',
'name',
'unit',
'price',
'image_url'
)
def change_image_url(self, obj):
return ''.join([
CDN_URL, str(obj.image_url)
]) if str(obj.image_url) else None
Wie ich versuchte, es für Paginierung ändern:
Views.py
class PaginatedProductList(APIView):
def get(self, request, format=None):
product_sync_ts = request.GET.get(
'product_sync_ts', None)
if product_sync_ts:
product = GrProduct.objects.filter(
update_ts__gt=product_sync_ts
)
paginator = Paginator(product, 1000)
page = request.GET.get('page')
try:
product = paginator.page(page)
except PageNotAnInteger:
product = paginator.page(1)
except EmptyPage:
product = paginator.page(paginator.num_pages)
serializer = SyncedProductSerializer(
instance={'products': product})
return Response(serializer.data)
else:
content = {'details': "Bad Request"}
raise APIException400(request, content)
Das funktioniert gut, ich paginierte Ergebnisse bin immer, aber das Problem ist, dass ich nicht in der Lage bin die nächste und vorherige Seite Informationen an den Client zu senden. Der Client hat keine Möglichkeit zu wissen, wie viele Seiten gültig sind (nicht leer).
Kann mir jemand vorschlagen, wie ich meinen Code ändern kann, um dies zu tun.
Danke, es funktionierte wie ein Charme :) –
Auch wie kann ich page_size und current_page_number zusammen mit next hinzufügen und vorher? –
Ich wollte die get_paginated_response-Methode anpassen, aber ich bin mir nicht sicher, ob ich es richtig mache oder nicht –