关于使用DRF的视图的示例

目录

1.使用APIview实现增删改查

models.py

views.py

serializers.py

urls.py

2.使用GenericAPIView实现增删改查

views.py

3.使用GenericAPIView以及五个拓展类实现增删改查

views.py

4.使用视图子类实现增删改查(9个)

views.py

urls.py

5.自动生成路由

方式一

方式二

路由

重写ModelViewSet中的方法

views.py

urls.py

拓展ModelViewSet中的方法


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

DRFDjango Rest Framework)是一个用于构建 Web API 的强大框架,而微信小程序是一种基于微信平台的应用程序。下面是一个 DRF 微信小程序开发示例: 1. 创建 Django 项目和应用程序 首先,我们需要使用 Django 创建项目和应用程序。在终端中输入以下命令: ``` django-admin startproject myproject cd myproject python manage.py startapp myapp ``` 2. 创建 DRF 视图 创建一个名为 views.py 的文件,并添加以下代码: ```python from rest_framework.views import APIView from rest_framework.response import Response from django.http import HttpResponse class MyView(APIView): def get(self, request): return Response({'message': 'Hello World!'}) def post(self, request): return Response({'message': 'Received POST request!'}) ``` 这里我们创建了一个名为 MyView 的 DRF 视图,该视图包含 get 和 post 方法。 3. 配置 URL 在应用程序的 urls.py 文件中,添加以下 URL 配置: ```python from django.urls import path from myapp.views import MyView urlpatterns = [ path('api/', MyView.as_view()), ] ``` 这里我们配置了一个名为 api 的 URL,该 URL 将映射到 MyView 视图。 4. 创建微信小程序 在微信开发者工具中创建一个新的小程序项目,设置相关配置并获取 AppID。 5. 编写小程序代码 在小程序的 app.js 文件中,添加以下代码: ```javascript App({ onLaunch: function () { console.log('App launched') }, }) ``` 这里我们定义了一个名为 onLaunch 的函数,该函数在小程序启动时被调用。 在小程序的 index.js 文件中,添加以下代码: ```javascript Page({ onLoad: function () { wx.request({ url: 'https://example.com/api/', method: 'GET', success: function (res) { console.log(res.data) } }) }, }) ``` 这里我们定义了一个名为 onLoad 的函数,该函数在小程序加载时被调用,并使用 wx.request 方法向我们创建的 DRF 视图发送 GET 请求。 6. 运行 DRF 服务器和小程序 在终端中输入以下命令以启动 DRF 服务器: ``` python manage.py runserver ``` 在微信开发者工具中运行小程序并查看控制台输出。如果一切正常,你应该能够看到来自 DRF 视图的响应。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值