Как использовать разбиение на страницы в rest-фреймворке django channels?

Я использую rest-фреймворк django channels для своего проекта и хочу использовать разбивку на страницы. Я нашел PaginatedModelListMixin.

Это мой пользователь:

class UserConsumer(GenericAsyncModelAPIConsumer):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    pagination_class = WebsocketPageNumberPagination

    @model_observer(User)
    async def user_activity(self, message, observer=None, **kwargs):
        await self.send_json(message)

    @user_activity.serializer
    def user_activity_serializer(self, instance, action, **kwargs):
        return {
            "action": action.value,
            "data": UserSerializer(instance).data,
        }

    async def connect(self):
        await self.accept()
        await self.user_activity.subscribe()

GenericAsyncModelAPIConsumer - это просто оболочка для всех готовых миксеров

class GenericAsyncModelAPIConsumer(
    PaginatedModelListMixin,
    CreateModelMixin,
    UpdateModelMixin,
    RetrieveModelMixin,
    DeleteModelMixin,
    GenericAsyncAPIConsumer,
):
    pass

WebsocketPageNumberPagination должен быть оболочкой для нумерации страниц в rest_framework, но у меня это не сработало.

Я отправляю запрос с помощью js WebSocket следующим образом:

class ModelWebSocket extends WebSocket {
  items = reactive([])

  
  constructor(url, protocols, pk = 'id') {
    // Call the parent constructor
    super(url, protocols)

    // List all items when the connection is opened
    this.onopen = () => {
      console.debug('[WS] Connected')
      this.list()
    }

    // Handle incoming messages
    this.onmessage = (event) => {
      const message = JSON.parse(event.data)

      console.log('[WS] Message', message)

      // Some more stuff, but the message is the interessting
    }

    // Close and error handling
    // ...
  }

  list() {
    return new Promise((resolve, reject) => {
      const requestId = this.#getAndSetPendingRequest(resolve, reject)
      this.send(
        JSON.stringify({
          action: 'list',
          request_id: requestId,
          page_size: 1, // just for testing, will be an attribute later
          page: 1,
        })
      )
    })
  }

  // ...
}

#getAndSetPendingRequest можно игнорировать, это просто для обработки запроса.

Мой текущий подход заключается в передаче kwargs как request.query_params:

class WebsocketPageNumberPagination(PageNumberPagination):
    """
    Pagination class that supports djangochannelsrestframework's additional parameters.
    """

    def paginate_queryset(self, queryset, request=None, **kwargs):
        kwargs.pop("view", None)
        kwargs.pop("request_id", None)
        request["query_params"] = kwargs
        # Call the parent method
        return super().paginate_queryset(queryset, request)

Которые не выдают ошибок, но и не разбивают результаты на страницы, просто дайте мне список данных, таких как ListModelMixin

В документации djangochannelsrestframework ничего не говорится об использовании PaginatedModelListMixin, и я также не нахожу никаких примеров в Интернете. AI Bots хочет написать мою собственную разбивку на страницы, но это не мое любимое решение.

На самом деле, я бы хотел, чтобы разбиение на страницы работало так же, как и в разбиении на страницы rest_framework. Я задаю page_size и page номера и получаю результаты для этой страницы вместе с метаданными, такими как count всех объектов. Лучше всего было бы, если бы websocket уведомлял только об изменениях моделей на текущей странице.

Вернуться на верх