Фильтрация записей JSON в Django Rest Framework - PullRequest
0 голосов
/ 24 октября 2019

Я создал конечную точку API DRF, чтобы иметь возможность собирать некоторые данные в мою базу данных и показывать их на моей странице Django с помощью Jquery.

Мои примеры данных выглядят так:

{
    "item": "Someitem",
    "Price": 120,
    "Status": "Free"
},
{
    "item": "SecondItem,
    "Price": 90,
    "Status": "Taken"
},

Так что, если я получу конечную точку из JQuery по этой ссылке: http://127.0.0.1:8000/tst/, я получу все записи и покажу их все на моей веб-странице. Но что, если, например, я хочу получить только только записей, чье поле Status установлено на Taken? Есть ли способ отредактировать запрос DRF, чтобы он указывал на http://127.0.0.1:8000/tst/Taken? Или вместо этого, если пользователь хочет получить все остальные со статусом, установленным на Free, он будет указывать на http://127.0.0.1:8000/tst/Free? Я знаю, что мог бы сделать это с помощью jquery, но на самом деле я хотел бы сделать это на стороне сервера.

Я пытался с этим:

queryset = tst.objects.filter(Status="Taken")

Но проблема здесь в том, что это будетвсегда берут только Taken записей из моей БД. В моем случае я хочу найти способ извлекать Taken иногда и Free иногда из шаблона.

Я довольно новичок в DRF, поэтому мои настройки довольно просты:

views.py

class tstList(generics.ListCreateAPIView):
    queryset = tst.objects.all()
    serializer_class = tstSerializer


class tstDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = tst.objects.all()
    serializer_class = tstSerializer

url.py

path('tst/', views.tstList.as_view()),
path('tst/<int:pk>/', views.tstDetail.as_view()),

models.py

class tst(models.Model):
    item = models.CharField()
    Price = models.FloatField()
    Status = models.CharField()


    def save(self, *args, using=None, **kwargs):
        super(tst, self).save(*args, **kwargs)

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

Посмотрите на DRF doc . В вашем случае я бы посоветовал вам установить django_filters, а затем, по вашему мнению:

from django_filters.rest_framework import DjangoFilterBackend

class tstList(generics.ListCreateAPIView):
    queryset = tst.objects.all()
    serializer_class = tstSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ('Status',)
1 голос
/ 25 октября 2019

Вы можете установить набор запросов с помощью django filter

queryset = tst.objects.filter(Status="Taken") # make sure the "Taken" is always Capitalized.
1 голос
/ 24 октября 2019

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

https://www.youtube.com/watch?v=rjUmA_pkGtw

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