Django 查询在 rest 框架的分页模型中没有正确排序/排序

Django Query is not ordering / Sorting Correctly in pagination model in rest framework

我有 705 个 Instagram 视频的元#Data,但我无法按名称对其进行排序 |编号 |上传日期或任何订单查询。 我的元数据模型是

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 休息框架分页并在参数中获取我的过滤器字段

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) but in vain data is not ordering correctly

也许,您可以使用 DRF 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)