Фильтруйте набор запросов в Python 3 и jQuery DataTables - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь сделать запрос в jQuery списке Datatables.

Сейчас я могу получить все записи из таблицы, но я хочу получить записи, которым соответствует родительский идентификатор.

Например, у пользователей есть посты, поэтому в моем случае это будут выборки постов, где идентификатор пользователя, скажем, 1.

Поэтому я пытаюсь реализовать то же самое для jQuery Datatables.

Я вижу, что данные публикуются, но не могу понять, как сделать запрос вместе с datatables, чтобы на это изменение не повлияли фильтры datatables.

Мой текущий код:

class PartRequestViewSet(CommonViewset, generics.RetrieveAPIView):
    queryset = PartRequest.objects.filter(deleted_at=None)
    serializer_class = PartRequestSerializer

    def list(self, request, *args, **kwargs):
        records = request.GET.get('records', None)
        # ID of the part
        part_number_id = request.GET.get('part_number_id', None)

        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)
        page = self.paginate_queryset(queryset)
        if page is not None and records is None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)


Теперь в приведенном выше коде я могу получить part_number_id из запроса, но как я могу отфильтровать записи, используя filter_queryset(), так что даются только parts_requests обратно в таблицы данных, где part_number_id равно 1

Обновление

Текущая вспомогательная функция filter_queryset, которая используется в приведенном выше коде.

    def filter_queryset(self, queryset):
        format = self.request.GET.get('format', None)
        if format == 'datatables':
            self.filter_backends += (DatatablesFilterBackend,)
        else:
            self.filter_backends += (DjangoFilterBackend,)
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Существует django-filter расширение. В вашем случае это может быть что-то вроде следующего:

from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend

from .models import Post
from .serializers import PostSerializer


class PostList(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['owner']

Тогда вы можете использовать запрос get следующим образом: /posts?owner=3, где 3 - идентификатор пользователя, а owner - ForeignKey в модели Post для пользователя.

0 голосов
/ 07 апреля 2020

Я сделал следующее:

Добавил следующие строки:

 if part_number_id:
     queryset = queryset.filter(part_number_id=part_number_id)

, так что теперь код выглядит так, и он отлично работает. Если есть какой-либо лучший и эффективный вариант, чем этот, пожалуйста, поделитесь.

class PartRequestViewSet(CommonViewset, generics.RetrieveAPIView):
    queryset = PartRequest.objects.filter(deleted_at=None)
    serializer_class = PartRequestSerializer

    def list(self, request, *args, **kwargs):
        records = request.GET.get('records', None)
        # ID of the part
        part_number_id = request.GET.get('part_number_id', None)
        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)
        if part_number_id:
            queryset = queryset.filter(part_number_id=part_number_id)
        page = self.paginate_queryset(queryset)
        if page is not None and records is None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...