Фильтрация данных для нескольких условий в DRF

Новичок в Django и испытываю трудности с реализацией простой операции фильтрации. У меня есть модель Order, которая имеет два поля - order_id и zipcode.

Пользователи будут передавать два вышеуказанных параметра в теле запроса, а я должен вернуть заказ, соответствующий этой комбинации.

API конечная точка:

POST https://myapi.com/orders/
{
  "order_id": "A123",
  "zipcode": 10001
}

Мое решение:

# views.py

from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from rest_framework.viewsets import ViewSet


from ..models import Order
from ..serializers import OrderSerializer


class OrderViewSet(ViewSet):
    def create(self, request):
        queryset = Order.objects.all()
        order = get_object_or_404(
            queryset.filter(order_id=request.data["order_id"]).filter(
                zipcode=request.data["zipcode"]
            )
        )
        serializer = OrderSerializer(order)
        return Response(serializer.data)

Вопросы

  1. Is ViewSet the right way to go here or should I use generics? Not sure which one to use when.

  2. Is there a better way to apply multiple filters than chaining them like I have done above?

  3. It feels weird to override the create method for a lookup. Is there a better way to do it?

Существует несколько способов. Некоторые способы могут быть такими,

queryset = Order.objects.all()

order_id = request.data["order_id"]
zipcode = request.data["zipcode"]

order = get_object_or_404(
    queryset.filter(order_id=order_id, zipcode=zipcode)
)

или

from django.db.models import Q

order = get_object_or_404(
    queryset.filter(Q(order_id=order_id) & Q(zipcode=zipcode))
)
Вернуться на верх