получить идентификаторы с запятыми в django - PullRequest
0 голосов
/ 28 января 2020

view.py

    def get(self, *args, **kwargs):
        res = Question.objects.all()

    # queryset = super().ListAPIView(*args, **kwargs)
    if 'tag' in self.request.GET:
        # split and directly put in main query

        res = res.filter(
            Tag_name=self.request.GET['tag']
        )
    if 'order_by' in self.request.GET:
        res = res.order_by(
            self.request.GET['order_by'])

    serializer = QuestionSerializers(res, many=True)
    return Response(serializer.data)

здесь я пытаюсь получить вопрос с некоторыми идентификаторами входных тегов и упорядочить по некоторым входным данным, как я могу использовать несколько идентификаторов тегов в URL, например,

http://127.0.0.1:8000/?tag=1,2&order_by=name 

, поэтому я получаю все объекты с идентификаторами тегов 1 и 2.

Ответы [ 3 ]

1 голос
/ 29 января 2020

Вы можете передать несколько параметров получения с тем же именем:

http://127.0.0.1:8000/?tag=1&tag=2&order_by=name 

По вашему мнению, вы можете получить доступ к списку, используя метод getlist:

def get(self, *args, **kwargs):
    # returns empty list if no tags are provided
    tags = self.request.GET.getlist('tag')

    # you can set a default field to order_by, if no field is provided
    order_by = self.request.GET.get('order_by', 'id')  

    # convert tags, currently strings, to int
    tags = [int(tag) for tag in tags]

    # not sure about this part would need to check your models
    res = Question.objects.filter(tag__id__in=tags).order_by(order_by)
    serializer = QuestionSerializers(res, many=True)
    return Response(serializer.data)

0 голосов
/ 29 января 2020

Ну, вы можете иметь обходной путь (или, точнее, больше django остальные ориентированные на фреймворк способ достижения этого), используя ListAPIView из DRF, например:

from rest_framework.generics import ListAPIView
class TagListAPIView(ListAPIView):
    serializer_class = QuestionSerializers
    filter_backends = (OrderingFilter)
    ordering_fields = ['name', ...any other fields you wanna put here as an option for ordering]
    ordering = 'name' #setting the default ordering
    def get_queryset(self):
        ids = self.request.query_params.get('tag', None)
        if not ids:
            return Question.objects.none() #Empty queryset
        return Question.objects.filter(id__in=ids.split(','))

Не тестировал код, но да должно быть где-то вокруг этого, и этот код не выполняет всю надлежащую обработку ввода, если какой-либо ввод мусора поступает от пользователя (что имеет место много раз). Вы можете написать более сильный код для этого, включив django -фильтры и поместив поле id в этот фильтр. Что даст вам всю проверку ошибок и их обработку. Я предоставил ссылки на DRF do c относительно фильтра, порядка и всего. https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter Посмотрите, его большое содержание. Пинг мне, если что-то неясно.

0 голосов
/ 28 января 2020

Вам нужно разделить значения tag на , и отфильтровать все теги с помощью фильтра id__in следующим образом

def get(self, *args, **kwargs):
    res = Question.objects.all()

    # queryset = super().ListAPIView(*args, **kwargs)
    if self.request.GET.get('tag'):
        # split and directly put in main query

        res = res.filter(
            tag_id__in=self.request.GET.get('tag').split(',')
        )
    if self.request.GET.get('order_by'):
        res = res.order_by(
            self.request.GET['order_by'])

    serializer = QuestionSerializers(res, many=True)
    return Response(serializer.data)
...