Django Query не упорядочивает/сортирует правильно в модели пагинации в rest framework
У меня есть 705 Meta#Data видеороликов Instagram, но я не могу отсортировать их по имени | id | дате загрузки или любому другому запросу. Моя модель метаданных имеет вид
class MetaData(models.Model):
# Info
id = models.IntegerField(primary_key=True)
tag = models.CharField(max_length=500)
# User Info
username = models.CharField(max_length=400)
followers = models.IntegerField()
verified = models.BooleanField()
profile = models.URLField()
# Video Info
upload_date = models.DateField()
upload_time = models.TimeField()
views = models.IntegerField()
duration = models.CharField(max_length=50)
comments = models.IntegerField()
likes = models.IntegerField()
dimension = models.CharField(max_length=50)
framerate = models.CharField(
max_length=100, blank=True, default='Not Found')
# Post
link = models.URLField()
codecs = models.CharField(max_length=200, blank=True, default='Not Found')
caption = models.CharField(max_length=100, blank=True, default='Not Set')
status = models.CharField(max_length=20, choices=(
('Pending', 'Pending'), ('Acquired', 'Acquired'), ('Rejected', 'Rejected')), default='Pending')
Я использую Django rest framework pagination и получаю поля моих фильтров в параметрах
def fetchVideosContentwithFilter(request, filters, directory=None):
paginator = PageNumberPagination()
paginator.page_size = 12
# Parameters
flts = ['upload_date']
if filters:
flts = json.loads(filters)
if 'upload_date' in flts:
flts.append('upload_time')
if directory and directory != 'all':
objs = MetaData.objects.filter(tag=directory)
else:
objs = MetaData.objects.all()
pages = paginator.paginate_queryset(objs.order_by(*flts), request)
query = s.MetaDataSerializer(pages, many=True)
return paginator.get_paginated_response(query.data)
Я также пытаюсь или заменяю
*paginator.paginate_queryset(objs.order_by(flts), request) with paginator.paginate_queryset(objs.order_by('-id'), request) но напрасно, данные не упорядочиваются правильно
.
Возможно, вы можете решить свою задачу с помощью DRF's ListAPIView.
from rest_framework.filters import OrderingFilter
from rest_framework.generics import ListAPIView
from rest_framework.pagination import PageNumberPagination
# Your custom pagination
class DefaultPagePagination(PageNumberPagination):
max_page_size = 100
page_size_query_param = "page_size"
page_size = 12
# Your view
class FetchVideosContentwithFilter(ListAPIView):
serializer_class = MetaDataSerializer
pagination_class = DefaultPagePagination
filter_backends = [
OrderingFilter,
]
ordering_fields = ["title", "created_at", "updated_at"]
def get_queryset(self):
# I'm not sure, how you get the directory param.
# I assume, you take it from query_params
directory = self.request.query_params.get('directory')
if directory and directory != 'all':
objs = MetaData.objects.filter(tag=directory)
else:
objs = MetaData.objects.all()
return objs
ListAPIView использует ListModelMixin, который реализует логику пагинации
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)