отправить параметры в URL в django - PullRequest
1 голос
/ 28 января 2020

У меня есть 2 модели:

class Tag(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Question(models.Model):
     name = models.CharField(max_length=255)
     Tag_name = models.ManyToManyField(Tag)

     def __str__(self):
        return self.name

views.py

class QuestionList(APIView):

def get(self, request, tag_id):

    res = Question.objects.filter(Tag_name=tag_id).prefetch_related('Tag_name').order_by('name')[:10]
    print(res)
    serializer = QuestionSerializers(res, many=True)
    data = {}
    return Response(serializer.data)
    # return Response(data)

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('tag=<int:tag_id>/', views.QuestionList.as_view()) //this needs to be edited
]

каков будет путь в url.py файл для отправки идентификатора и параметра имени и получения данных, таких как

http://127.0.0.1:8000?tag=4&order_by=name

, поэтому я получаю все вопросы с тегом 4 и порядком по имени?

Ответы [ 2 ]

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

Строка запроса [wiki] является , а не частью пути. Эти параметры можно получить в объекте request.GET, который похож на словарь.

Ваш путь должен выглядеть следующим образом:

path('/', views.QuestionListView.as_view()),

В вашем QuestionListView вы можете затем отфильтруйте эти параметры:

class QuestionListView(ListAPIView):
    model = Question
    serializers = QuestionSerializers

    def get_queryset(self, *args, **kwargs):
        queryset = super().get_queryset(*args, **kwargs)
        if 'tag' in self.request.GET:
            queryset = queryset.filter(
                <b>Tag_name=self.request.GET['tag']</b>
            )
        if 'order_by' in self.request.GET:
            queryset = queryset.order_by(<b>self.request.GET['order_by']</b>)
        return queryset

    # &hellip;

При этом, для вышеперечисленного потребуются дополнительные строительные леса. Здесь вы позволяете пользователям «вводить» элементы в .order_by(..). Хакер может использовать это, например, упорядочивая элементы по связанным данным и, таким образом, бинарный поиск в определенных полях.

Возможно, стоит взглянуть на django-filter [ GitHub] , где вы можете определить, какие элементы вы можете фильтровать, и т. Д. c. Кроме того, он будет инкапсулировать фильтрацию, и, таким образом, будет удобно работать с этим в разных представлениях.

Примечание : обычно имена полей в модели Django записано в snake_case , а не PerlCase , поэтому должно быть: tags вместо Tag_name. Это потому, что ManyToManyField относится к нулю, одному или нескольким тегам и, кроме того, относится к тегу объектов , а не к имени тегов.

Примечание : Вместо реализации представления с нуля, возможно, стоит взглянуть на ListAPIView класс [drf-doc] который уже может реализовать много шаблонный код .

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

Если вы хотите отправить несколько параметров Url с помощью Django, используя этот URL:

http://127.0.0.1:8000?tag=4&order_by=name

, используя путь в urls.py, попробуйте следующее:

path('tag=<int:tag_id>/order_by=<str:name>', views.QuestionList.as_view()) 

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

...