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)
我有 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)