在Django Rest Framework中,使用Url内部的多个参数检索对象



如何使用url中的多个参数检索对象?示例:"客户/3/订单/1/"或"客户/<int:customer_pk>订单/<int:pk>/'

使用shell,我可以得到这样的对象,但我似乎无法从视图中做到这一点。

>>> from temp.models import Customer, Order
>>> from temp.serializers import CustomerSerializer, OrderSerializer
>>> q = Order.objects.filter(customer=1).get(order_number=2)
>>> q.order_name
'fruit'

视图.py

from rest_framework import generics
from rest_framework.views import APIView
from .models import *
from .serializers import *
class OrderDetailView(generics.RetrieveDestroyAPIView):
serializer_class = OrderSerializer 
def get_queryset(self):
queryset = Order.objects.filter(customer_id=self.kwargs["customer_pk"]).get(order_number=self.kwargs["pk"])
return queryset

urls.py

from django.urls import path
from .views import *
urlpatterns = [   
path('<int:customer_pk>/orders/<int:pk>/', OrderDetailView.as_view()),    
]

我们可以覆盖查询集:

class OrderDetailView(generics.RetrieveDestroyAPIView):
lookup_field = "pk"
serializer_class = OrderSerializer 
def get_queryset(self):
return Order.objects.filter(customer_id=self.kwargs["customer_pk"])

仅此而已,检索已经由get_object()方法处理的对象Order


如果想要更安全,请确保客户有效(客户可用(:

from django.shortcuts import get_object_or_404
class OrderDetailView(generics.RetrieveDestroyAPIView):
lookup_field = "pk"
serializer_class = OrderSerializer 
def get_customer(self):
return get_object_or_404(
Customer.objects.all(),
id=self.kwargs["customer_pk"]
)
def get_queryset(self):
customer = self.get_customer()
return Order.objects.filter(customer=customer)

filter多参数查询

queryset = Order.objects.filter(customer_id=self.kwargs["customer_pk"],order_number=self.kwargs["orde_pk"])

最新更新