Фильтрация данных для нескольких условий в 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)
Вопросы
Is ViewSet the right way to go here or should I use generics? Not sure which one to use when.
Is there a better way to apply multiple filters than chaining them like I have done above?
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))
)