Я использую класс разбивки курсора 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())
Существует несколько проблем:
- Данные, которые я отправляю в функции списка, представляют собой весь набор запросов, а не «разбитый на страницы» набор запросов, который я собираюсь сделать
- I ' Я не могу получить доступ к атрибуту
stuff
из content_object
из параметра data
в функции get_paginated_response
. - Я не уверен, как получить следующий курсор, текущую страницу, количество оставшихся страниц и т. д. c.
Помощь по любым из этих вопросов очень важна! (Я знаю, что использование GenericFKs ужасно, но это очень важно для моей ситуации. Я специально разработал БД для его использования).