Django休息框架中的分页 [英] Pagination in Django Rest Framework
问题描述
我想使用Django Rest Framework应用分页。我有以下GET视图。
def get(self,request,format = None):
response_data = []
status = request.GET.getlist('status')或None
location = request.GET.getlist('location')或None
category = request.GET.getlist( 'category')或None
min_price = request.GET.get('min_price')或无
max_price = request.GET.get('max_price')或无
ModelA_obj = Model.objects.all()
如果状态:ModelA_obj = ModelA_obj.filter(status__in = status)
如果位置:ModelA_obj = ModelA_obj.filter(location__in = location)
如果min_price: ModelA_obj = ModelA_obj.filter(minimum_expected_price__gte = int(min_price))
如果max_price:ModelA_obj = ModelA_obj.filter(buyout_price__lte = int(max_price))
如果类别:
category_List = ModelB.objects。 filter(subcategory__name__in = category).values_list('column',flat = True)
ModelA_obj = ModelA_obj.fil ter(id__in = category_List)
在ModelA_obj中的obj:
#this从我的不同模型中获取所有细节
details = ModelA.get_details(obj)
response_data .append(details)
return响应(response_data)
如何分页数据?目前它返回所有数据。我已经阅读了API文档,以及SO上的各种线程,因此我在settings.py
中应用了以下内容: REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':(
'rest_framework.authentication.TokenAuthentication',
),
#'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination'
#'PAGE_SIZE':2,
'PAGINATE_BY':1,
'PAGINATE_BY_PARAM':'page'
}
但似乎没有任何效果。我的网址是 http://127.0.0.1:8000/post/?page=1
,我目前有5-6条记录,因此我设置 PAGE_SIZE
为1,但仍然无法正常工作。如何分页我的数据记录?
编辑
以下是我的模型
class ModelA(models.Model):
col1 = models.CharField(max_length = 255)
Col2 = models.TextField(blank = True,null = True)
def get_details(obj):
#get来自ModelB和ModelC的数据引用FK`obj`
class ModelB(models.Model):
col3 = models.CharField(max_length = 255)
fk_A = models.ForeignKEy(ModelA)
class ModelC(models.Model):
col4 = models.CharField(max_length = 255)
fk_A = models.ForeignKEy(ModelA)
预期回应
{
col1:value,
col2:value,
modelb_details:[col3_value1,col3_value2 ...],
modelc_details:[col4_value1,col4_value2 .... ],
},
{
col1:value,
col2:value,
modelb_details:[col3_value1,col3_value2 ....],
modelc_details:[col4_value1,col4_value2 ....],
}
取消设置设置中的两行代码
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':2,
编辑
在序列化程序中
$ b $
modelc_details = ModelCSerializer(source =model_c)
class Meta:
model = ModelA
class ModelBerializer(serializers.ModelSerializer):
class Meta:
model =模型B
fields =('col3',)
类ModelCSerializer(serializers.ModelSerializer):
class Meta:
model = ModelC
fields =('col4',)
在视图
response_data = ModelASerializer(objs).data
*其中objs是ModelA的查询器
I want to apply pagination using Django Rest Framework. I've the following GET view.
def get(self,request,format=None):
response_data = []
status = request.GET.getlist('status') or None
location = request.GET.getlist('location') or None
category = request.GET.getlist('category') or None
min_price = request.GET.get('min_price') or None
max_price = request.GET.get('max_price') or None
ModelA_obj = Model.objects.all()
if status : ModelA_obj = ModelA_obj.filter(status__in=status)
if location : ModelA_obj = ModelA_obj.filter(location__in=location)
if min_price : ModelA_obj = ModelA_obj.filter(minimum_expected_price__gte=int(min_price))
if max_price : ModelA_obj = ModelA_obj.filter(buyout_price__lte=int(max_price))
if category :
category_List = ModelB.objects.filter(subcategory__name__in=category).values_list('column',flat=True)
ModelA_obj = ModelA_obj.filter(id__in=category_List)
for obj in ModelA_obj:
#this fetches me all the details from different models
details = ModelA.get_details(obj)
response_data.append(details)
return Response(response_data)
How do I paginate the data? Currently it returns all the data. I've read the API Documentation, and various threads on SO as well, hence I applied the following in settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
#'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
#'PAGE_SIZE': 2,
'PAGINATE_BY': 1,
'PAGINATE_BY_PARAM': 'page'
}
But nothing seems to work. My URL is http://127.0.0.1:8000/post/?page=1
, and I currently have 5-6 records in it, hence I set PAGE_SIZE
as 1, but it still not working as expected. How do I paginate my data records?
EDIT
Following are my models
class ModelA(models.Model):
col1 = models.CharField(max_length=255)
Col2 = models.TextField(blank=True,null=True)
def get_details(obj):
#get data from ModelB and ModelC referenced with FK `obj`
class ModelB(models.Model):
col3 = models.CharField(max_length=255)
fk_A = models.ForeignKEy(ModelA)
class ModelC(models.Model):
col4 = models.CharField(max_length=255)
fk_A = models.ForeignKEy(ModelA)
Expected Response
{
"col1": value,
"col2": value,
"modelb_details": [col3_value1, col3_value2....],
"modelc_details": [col4_value1, col4_value2....],
},
{
"col1": value,
"col2": value,
"modelb_details": [col3_value1, col3_value2....],
"modelc_details": [col4_value1, col4_value2....],
}
Uncomment the two lines of code in your settings
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 2,
EDIT
In serializers
class ModelASerializer(serializers.ModelSerializer):
modelb_details=ModelBSerializer(source="model_b")
modelc_details=ModelCSerializer(source="model_c")
class Meta:
model = ModelA
class ModelBSerializer(serializers.ModelSerializer):
class Meta:
model = ModelB
fields = ('col3',)
class ModelCSerializer(serializers.ModelSerializer):
class Meta:
model = ModelC
fields = ('col4',)
In views
response_data = ModelASerializer(objs).data
*where objs is an queryset of ModelA
这篇关于Django休息框架中的分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!