Как пагинация различных объектов одной конечной точки в Django Rest Framework?

Предположим, что у меня есть модель с именем Collection. Я могу создать коллекцию collection, эта коллекция имеет два важных поля: share_with_company, share_list.

class Collection(models.Model):
    name = models.CharField(max_length=200, blank=False, null=False)
    share_with_company = models.BooleanField(default=False)
    share_list = ArrayField(models.CharField(max_length=15), null=True, blank=True)
    owner = models.CharField(max_length=200, blank=False, null=False)

в настоящее время у меня есть конечная точка: /collections и эта конечная точка должна возвращать что-то вроде этого:

    {
       shared_with_company:{collections: ..., count: 5}
       shared_list:{collections: ..., count: 12}
       my_collections:{collections: ..., count: 20} //dont shared with anyone, created by the current user
    }

Но во фронтенде пользователь хочет просмотреть только my_collections или только shared_list или shared_with_company. Мне нравится производительность, поэтому я должен создать специфические конечные точки для каждого типа коллекций? Но, каждый раз, когда пользователь загружает страницу коллекций, она будет показывать 12 (максимум на страницу) коллекций каждой (my_collections, shared и т.д.), а затем он сможет просмотреть их постранично. Я не знаю, является ли это лучшим способом сделать это, я думаю, что многие пользователи посылают 3 запроса каждый раз, когда страница загружается.

Другой подход: использовать конечную точку для загрузки начальной страницы, и эта точка будет делать один запрос к первой странице, а пагинации будут делаться с разных конечных точек.

Я действительно не знаю, есть ли лучший подход или что-то в этом роде.

Обычным подходом будет создание трех различных конечных точек. Это нормально, когда пользователь посылает 3 запроса к api, на самом деле это может быть даже лучше, так как ваш фронтенд может показывать данные более динамично. Также вам не нужно возвращать все данные каждый раз, только список, запрошенный пользователем.

Если вы используете ModelViewSet, поскольку это одна модель для трех конечных точек, вы можете просто добавить новые действия с декоратором @action и переопределить get_queryset. Таким образом, у вас будут такие конечные точки - collections/shared_with_company, collections/shared_list и collections/my_collections

В вашем get_queryset вы можете определить, какой queryset вы хотите вернуть, например:

def get_queryset(self):
    queryset = super().get_queryset()
    if self.action == 'list':
        return queryset
    elif self.action == 'shared_with_company':
        return queryset.filter(share_with_company=True)
Вернуться на верх