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