在之前的写过的接口中,我先后用了基于View和APIView来编写视图类
基于APIView类的时候相对于View会有很多便捷,但其实drf还在APIView的基础上又封装了一个 GenericAPIView 类,会大大减少了在编写视图时的重复代码和在修改代码时的工作量。
GenericAPIView
允许你通过queryset
和serializer_class
属性来指定视图操作的数据集和序列化器。以便于在修改代码时不必要整篇修改。
lookup_field
和lookup_url_kwarg
属性,使得可以自定义如何通过 URL 参数来查找特定的模型实例。这为细节视图提供了灵活的查找机制。
order/views.py
from rest_framework.generics import GenericAPIView
from apps.order.models import Order
from apps.order.serializers import OrderSerializer
from utils import ResponseMessage
class OrderListGenericAPIView(GenericAPIView):
serializer_class = OrderSerializer # 指定序列化器类
queryset = Order.objects.all() # 获取查询集
lookup_fields = ['user'] # 告诉Drf在URL里用什么关键词来找到对应的数据记录(get请求)
def post(self, request, *args, **kwargs):
# print(self.get_queryset())
# print(self.get_serializer())
data = request.data
# print(data)
order = self.get_serializer(data=data)
if order.is_valid(raise_exception=True):
# print(order.data)
order.save()
return ResponseMessage.OrderResponse.success(order.data)
else:
return ResponseMessage.OrderResponse.failed(order.errors)
def get(self, request, user):
# print(user)
# 查询数据库所有数据
# return ResponseMessage.OrderResponse.success(self.get_serializer(instance=self.get_queryset(), many=True).data)
orders = self.get_serializer(instance=self.get_queryset().filter(user=user), many=True)
return ResponseMessage.OrderResponse.success(orders.data)
order/urls.py
from django.urls import path
from apps.order import views
urlpatterns = [
# path('list/', views.OrderListGenericAPIView.as_view(), name='order_list'),
path('list/<int:user>/<int:status>', views.OrderListGenericAPIView.as_view(), name='order_detail')
]
若有错误与不足请指出,关注DPT一起进步吧!!!