Разбивка на страницы в Django Rest Framework

Я хочу применить разбиение на страницы с помощью Django Rest Framework. У меня есть следующее представление GET.

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)

Как разбить данные на страницы? В настоящее время он возвращает все данные. Я прочитал документацию 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' 

}

Но ничего не работает. Мой URL-адрес 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 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)

Ожидаемый ответ

{
        "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....],
}

person PythonEnthusiast    schedule 15.05.2015    source источник


Ответы (1)


Раскомментируйте две строки кода в настройках.

'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 2,

ИЗМЕНИТЬ

В сериализаторах

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',)

В представлениях

response_data = ModelASerializer(objs).data

*где objs - это набор запросов ModelA

person Geo Jacob    schedule 15.05.2015
comment
Не работает. Я тоже это пробовал. Он по-прежнему показывает все 5 записей, которые у меня есть в БД. - person PythonEnthusiast; 15.05.2015
comment
Вам нужно написать сериализатор для данных ответа. - person Geo Jacob; 15.05.2015
comment
Я имею в виду заменить details = ModelA.get_details(objs,category=True,image=True,bid=True,rating=True) на response_data = ModelASerializer(objs).data - person Geo Jacob; 15.05.2015
comment
И как я могу написать собственный сериализатор для этого? - person PythonEnthusiast; 15.05.2015
comment
Я видел ваш отредактированный код. Предоставленный вами способ неприменим в моем случае, поскольку данные, которые будут возвращены сериализатором, будут только из определенного режима. Я получаю данные из разных моделей, поэтому ваш сериализатор неприменим. - person PythonEnthusiast; 15.05.2015
comment
Вы можете писать настраиваемые поля в сериализаторе для разных объектов моделей. - person Geo Jacob; 15.05.2015
comment
Предоставьте свою модель, пожалуйста, а также образец ожидаемого ответа - person Geo Jacob; 15.05.2015
comment
Взгляните на django-rest-framework.org/api-guide. /отношения/ - person Geo Jacob; 15.05.2015