目录
3.使用GenericAPIView以及五个拓展类实现增删改查
1.使用APIview实现增删改查
models.py
from django.db import models
# Create your models here.
class Customer(models.Model):
"""
客户表
"""
name = models.CharField(verbose_name='姓名', max_length=32)
age = models.CharField(verbose_name='年龄', max_length=32)
email = models.EmailField(verbose_name='邮箱', max_length=32)
company = models.CharField(verbose_name='公司', max_length=32)
class Meta:
db_table = 'Customer'
verbose_name = "客户"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Payment(models.Model):
"""
付费记录
"""
customer = models.ForeignKey(verbose_name='关联客户',on_delete=models.CASCADE, to='Customer')
money = models.IntegerField(verbose_name='付费金额')
create_time = models.DateTimeField(verbose_name='付费时间', auto_now_add=True)
class Meta:
db_table = 'Payment'
verbose_name = "收入"
verbose_name_plural = verbose_name
def __str__(self):
self.money
views.py
from . import models,serializers
# Create your views here.
from rest_framework.views import APIView
from rest_framework.response import Response
class CustomerView(APIView):
def post(self,request,*args,**kwargs):
'''
创建客户
'''
ser = serializers.CustomerSerializer(data=request.data)
if ser.is_valid():
#校验通过后保存为序列化格式
instance_data = ser.save()
resurt = serializers.CustomerSerializer(instance=instance_data)
return Response({"data":resurt.data},200)
else:
return Response({"data":ser.errors},300)
def get(self,request,*args,**kwargs):
"""
获取所有的到客户信息
"""
customers = models.Customer.objects.all()
ser = serializers.CustomerSerializer(instance=customers,many=True)
return Response({"data":ser.data},200)
class CustomerDetailView(APIView):
def get(self,request,*args,**kwargs,):
"""
获取到单一客户信息
"""
customer = models.Customer.objects.filter(pk=kwargs.get("pk")).first()
ser = serializers.CustomerSerializer(customer)
return Response({"data":ser.data},200)
def put(self,request,*args,**kwargs):
'''
修改单一客户信息
'''
customer = models.Customer.objects.filter(pk=kwargs.get("pk")).first()
ser = serializers.CustomerSerializer(data=request.data,instance=customer)
if ser.is_valid():
ser.save()
return Response({"data":ser.data},200)
else:
return Response({"data":ser.erros},300)
def delete(self,request,*args,**kwargs):
'''
删除某一客户
'''
models.Customer.objects.filter(pk=kwargs.get("pk")).first().delete()
return Response({"data:":"删除成功"},200)
serializers.py
from rest_framework import serializers
from .models import Customer,Payment
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = "__all__"
urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [
path('customer/',views.CustomerView.as_view()),
path(r'customer/<int:pk>/', views.CustomerDetailView.as_view()),
]
2.使用GenericAPIView实现增删改查
在1的基础上只更改了views视图,简化了增删改查的代码
views.py
from . import models,serializers
# Create your views here.
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
class CustomerView(GenericAPIView):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
def post(self,request,*args,**kwargs):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
#校验通过后保存为序列化格式
ser.save()
resurt = serializers.CustomerSerializer(ser.data)
return Response({"data":resurt.data},200)
else:
return Response({"data":ser.errors},300)
def get(self,request,*args,**kwargs):
customers = self.get_queryset()
ser = self.get_serializer(customers,many=True)
return Response({"data":ser.data},200)
class CustomerDetailView(GenericAPIView):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
def get(self,request,*args,**kwargs,):
customer = self.get_object()
ser = self.get_serializer(customer)
return Response({"data":ser.data},200)
def put(self,request,*args,**kwargs):
customer = self.get_object()
ser = self.get_serializer(customer,data=request.data)
if ser.is_valid():
ser.save()
return Response({"data":ser.data},200)
else:
return Response({"data":ser.erros},300)
def delete(self,request,*args,**kwargs):
customer = self.get_object()
customer.delete()
return Response({"data:":"删除成功"},200)
3.使用GenericAPIView以及五个拓展类实现增删改查
在2或者1的基础上只是更改了views.py
views.py
from . import models,serializers
# Create your views here.
# 导入rest_framework的五个视图拓展类,分别是增,查,删,改,查一个
from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,UpdateModelMixin,RetrieveModelMixin
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
class CustomerView(GenericAPIView,CreateModelMixin,ListModelMixin):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
def post(self,request,*args,**kwargs):
return self.create(request,*args,**kwargs)
def get(self,request,*args,**kwargs):
return self.list(request,*args,**kwargs)
class CustomerDetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
def get(self,request,*args,**kwargs):
return self.retrieve(request,*args,**kwargs)
def put(self,request,*args,**kwargs):
return self.update(request,*args,**kwargs)
def delete(self,request,*args,**kwargs):
return self.destroy(request,*args,**kwargs)
4.使用视图子类实现增删改查(9个)
在3,2或者1的基础上只是更改了views.py
from . import models,serializers
# Create your views here.
from rest_framework.generics import ListAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateDestroyAPIView,RetrieveDestroyAPIView,RetrieveUpdateAPIView
class CustomerView(ListCreateAPIView):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
class CustomerDetailView(RetrieveUpdateDestroyAPIView):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
5使用viewsets视图集实现增删改查
views.py
from . import models,serializers
# Create your views here.
from rest_framework.viewsets import ModelViewSet
# 5个接口
class CustomerView(ModelViewSet):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [
path('customer/',views.CustomerView.as_view({'get':'list','post':'create'})),
path(r'customer/<int:pk>/', views.CustomerView.as_view({'get':'retrieve','delete':'destroy','put':'update'})),
]
###########################################
5.自动生成路由
(必须是继承ViewSetMixin以及子类才能生成路由)
方式一
from django.urls import path,re_path
from . import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('customer',views.CustomerView)
urlpatterns = [
]
urlpatterns+=router.urls
方式二
from django.urls import path, re_path, include
from . import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('customer',views.CustomerView)
urlpatterns = [
path('',include(router.urls))
]
路由
重写ModelViewSet中的方法
如果觉得每一个都定义格式麻烦可以自己重写MOdeViewSet函数
views.py
from rest_framework.response import Response
from . import models,serializers
# Create your views here.
from rest_framework.viewsets import ModelViewSet
# 5个接口
class CustomerView(ModelViewSet):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
# 重写list方法,使其返回的数据是我们理想的数据返回格式
def list(self, request, *args, **kwargs):
response = super().list(request,*args,**kwargs)
res = {"data":response.data,"msg":"查询成功","code":100}
return Response(res)
urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [
path('customer/',views.CustomerView.as_view({'get':'list','post':'create'})),
path(r'customer/<int:pk>/', views.CustomerView.as_view({'get':'retrieve','delete':'destroy','put':'update'})),
]
拓展ModelViewSet中的方法
from rest_framework.response import Response
from . import models,serializers
from rest_framework.decorators import action
# Create your views here.
from rest_framework.viewsets import ModelViewSet
# 5个接口
class CustomerView(ModelViewSet):
queryset = models.Customer.objects.all()
serializer_class = serializers.CustomerSerializer
# 重写list方法,使其返回的数据是我们理想的数据返回格式
def list(self, request, *args, **kwargs):
response = super().list(request,*args,**kwargs)
res = {"data":response.data,"msg":"查询成功","code":100}
return Response(res)
# 自己拓展的方法,需要自己使用一个装饰器
@action(methods=['GET'],detail=False,url_name="login")
def login(self, request, *args, **kwargs):
return Response("登录成功")
如果derail=True
生成的路由是
coustomer/2/login