Разбиение курсора DRF с помощью структуры ContentType в представлении списка - PullRequest
0 голосов
/ 11 января 2020

Я использую класс разбивки курсора Django -Rest-Framework, а также инфраструктуру ContentType Django. У меня есть некоторые модели, которые в основном (рукописные данные) выглядят следующим образом:

from django.contrib.contentypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class CombinedModel(models.Model):
    id = models.UUIDField(default=uuid4(), primary_key=True)
    created = models.DateTimeField(auto_now_add=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = BigIntegerField()
    content_object = GenericForeignKey()

class Amodel(models.Model):
    stuff = models.CharField(max_length=100)

Теперь я хочу иметь возможность разбивать на страницы CombinedModel, используя общий вид c. Проблема возникает из-за того, что разбиение на страницы курсора не может получить данные stuff при доступе от AModel до content_object.

Так что это то, что я до сих пор имею для набора и просмотра курсора (то есть ошибка):

from rest_framework.pagination import CursorPagination

class MyObject(object):
    def __init__(self, content_type, object_id, stuff):
        self.content_type = content_type
        self.object_id = object_id
        self.stuff = stuff

class MySerializer(serializer.Serializer):
    content_type = serializer.CharField(max_length=20)
    object_id = serializer.IntegerField()
    stuff = serializer.CharField(max_length=100)

class CursorSetPagination(CursorPagination):
    page_size = 5
    page_size_query_param = "page_size"
    ordering = "-created"

    def get_paginated_response(self, data):
        items = []
        for x in data:
            model_name = x.content_type.model.capitalize()
            items.append(MyObject(content_type=model_name, object_id=x.object_id, stuff=x.content_object.stuff))
        serializer = MySerializer(items, many=True)
        return Response({'results': serializer.data}) 

Также должен быть следующий курсор и количество оставшихся страниц или, по крайней мере, количество страниц и текущая страница, но я не могу получить к нему доступ

class CombinedViewSet(viewsets.GenericViewSet):
    pagination_class = CursorSetPagination
    serializer_class = MySerializer

    def get_queryset(self):
        return CombinedModel.objects.all()

    def list(self, request):
        return self.get_paginated_response(self.get_queryset())

Существует несколько проблем:

  1. Данные, которые я отправляю в функции списка, представляют собой весь набор запросов, а не «разбитый на страницы» набор запросов, который я собираюсь сделать
  2. I ' Я не могу получить доступ к атрибуту stuff из content_object из параметра data в функции get_paginated_response.
  3. Я не уверен, как получить следующий курсор, текущую страницу, количество оставшихся страниц и т. д. c.

Помощь по любым из этих вопросов очень важна! (Я знаю, что использование GenericFKs ужасно, но это очень важно для моей ситуации. Я специально разработал БД для его использования).

...