首页 > 其他分享 >Django - Rest Framework 框架

Django - Rest Framework 框架

时间:2024-05-12 20:56:49浏览次数:18  
标签:name request Rest Django Framework VocationSerializer 序列化 data id

目录

DRF 的安装与配置

为了简化API的开发过程,我们可以使用Django Rest Framework 框架实现API开发。使用框架开发不仅能减少代码冗余,还可以规范代码的编写格式,这对企业级开发来说很有必要,毕竟每个开发人员的编程风格存在一定的差异,开发规范可以方便其他开发人员查看和修改。

在使用Django Rest Framework 之前,首先安装 Django Rest Framework

pip install djangorestframework

安装完成之后进行配置:

# MyDjango\setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
    'user',
    'rest_framework' # 添加 Django Rest Framework 框架
]

# Django Rest Framework 框架 设置信息
# 分页设置
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
                  # 每页显示多少数据
                  'PAGE_SIZE': 2}

案例以下面表讲解:

数据:

序列化类 Serializer

在项目的应用index 的 serializers.py 中定义序列化类:

class VocationSerializer(serializers.Serializer):
    id =  serializers.IntegerField(read_only=True)
    job = serializers.CharField(max_length=100)
    title = serializers.CharField(max_length=100)
    payment= serializers.CharField(max_length=100)

    name = serializers.PrimaryKeyRelatedField(queryset=NAME_LIST)


    def create(self, validated_data):
        return Vocation.objects.create(**validated_data)

    def update(self, instance, validated_data):
        return instance.update(**validated_data)

自定义序列化类 VocationSerializer 的字段对应 模型Vocation 的字段,序列化字段的数据类型可以在 Rest Framework 的源码文件fields.py 中找到定义过程,它们都继承父类Field。

在定义序列化字段的时候,每个序列化字段允许设置参数信息,分析父类Field 的初始化参数,它们适用于所有序列化字段的参数设置,说明如下:

  • read_only: 设置序列化字段的只读属性
  • write_only:设置序列化字段的编辑属性
  • required: 设置序列化字段的数据是否为空,默认值为True
  • default: 设置序列化字段的默认值
  • initial:设置序列化字段的初始值
# index\urls.py

urlpatterns = [
    # path('<pk>/<age>.html', index.as_view(), name='index')
    path('', vocationDef , name='myDef'),
    path('vocationClass/', VocationClass.as_view(), name='vocationClass')
]
# index\views.py
from .models import Vocation
from .serializers import VocationSerializer
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework.views import APIView


@api_view(['GET', 'POST'])
def vocationDef(request):
    if request.method == 'GET':
        q = Vocation.objects.all().order_by('id')
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request)
        # 序列化
        serializer = VocationSerializer(instance=p, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        data = request.data
        id = data['name']
        data['name'] = PersonInfo.objects.filter(id=id).first()
        instance = Vocation.objects.filter(id=data.get('id', 0))

        if instance:
            # 修改数据
            VocationSerializer().update(instance, data)
        else:
            # 创建数据
            VocationSerializer().create(data)
        return Response('Done', status=status.HTTP_201_CREATED)


class VocationClass(APIView):

    def get(self, request):
        q = Vocation.objects.all().order_by('id')
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request)
        # 将分页后的数据传递给 VocationSerializer,生成JSON数据对象
        serializer = VocationSerializer(instance=p, many=True)
        # 返回对象 有 Rest Framework 框架实现
        return Response(serializer.data)

    def post(self, request):
        """修改或新增"""
        request_body = request.data
        print(request_body)  # {'id': 1, 'job': '软件工程师1', 'title': 'Python开发', 'payment': '10000', 'name': 2}

        personinfo_id = request_body['name']

        request_body['name'] = PersonInfo.objects.filter(id=personinfo_id).first()  # first 返回的是一个obj
        print(request_body)  # {'id': 1, 'job': '软件工程师2', 'title': 'Python开发', 'payment': '10000', 'name': <PersonInfo: Tim>}

        instance = Vocation.objects.filter(id=request_body.get('id', 0))

        if instance:
            # 修改数据
            VocationSerializer().update(instance, request_body)
        else:
            # 创建数据
            VocationSerializer().create(request_body)
        return Response('Done', status=status.HTTP_201_CREATED)

vocationDef 视图函数验证:

访问: http://localhost:8000/

查询到前2条数据

新增一条数据:

结果:

标签:name,request,Rest,Django,Framework,VocationSerializer,序列化,data,id
From: https://www.cnblogs.com/czzz/p/18188130

相关文章

  • Django国际化与本地化指南
    title:Django国际化与本地化指南date:2024/5/1216:51:04updated:2024/5/1216:51:04categories:后端开发tags:Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化引言在数字化时代,网站和应用程序必须跨越地域限制,服务于全球用户。这就是国际化......
  • Presto学习笔记——Go客户端连接Presto
    1.查询PrestoDB(facebook版本)1.创建PrestoDB环境使用docker创建presto测试环境https://hub.docker.com/r/prestodb/presto/tags拉取镜像dockerpullprestodb/presto:0.284启动dockerrun-p8080:8080-ti-v/Users/lintong/Downloads/config.properties:/opt/pres......
  • 补档 https://github.com/taichi-framework/TaiChi/wiki/FAQ/9eeeef88cdbcee6a2834969
    taichi-framework/TaiChiPublicNotificationsFork 572 Star 5.9kCodePullrequestsActionsWikiSecurityInsightsFAQ weishueditedthispage onNov2,2018 · 17revisions如何使用点击右下角浮动按钮,然后选择“创建应用”......
  • 补档 https://github.com/taichi-framework/TaiChi/wiki/%E5%87%86%E5%A4%87%E4%BA%8B
    taichi-framework/TaiChiPublicNotificationsFork 570 Star 5.9kCodePullrequestsActionsWikiSecurityInsights准备事项 weishueditedthispage onJan22,2019 · 1revision太极·Magisk准备事项数据备份系统数据......
  • 补档 https://github.com/taichi-framework/TaiChi/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE
    taichi-framework/TaiChiPublicNotificationsFork 572 Star 5.9kCodePullrequestsActionsWikiSecurityInsights常见问题 weishueditedthispage onMar1,2019 · 14revisionsQ:无法触发Magisk版?A:建议使用Magisk17.x版......
  • 补档 https://github.com/taichi-framework/TaiChi/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF
    taichi-framework/TaiChiPublicNotificationsFork 569 Star 5.9kCodePullrequestsActionsWikiSecurityInsights如何使用 weishueditedthispage onJan22,2019 · 6revisions如何使用太极·Magisk?说明太极·Magisk......
  • Django性能之道:缓存应用与优化实战
    title:Django性能之道:缓存应用与优化实战date:2024/5/1118:34:22updated:2024/5/1118:34:22categories:后端开发tags:缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践引言在当今的互联网时代,用户对网站和应用程序的性能要求越来......
  • django 点击按钮,显示文本,js实现
    方法一:点击显示弹出框<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>数据弹窗</title><scripttype="text/javascript">functionshowAlert(data){......
  • Django 静态文件管理与部署指南
    title:Django静态文件管理与部署指南date:2024/5/1017:38:36updated:2024/5/1017:38:36categories:后端开发tags:WebOptCDN加速DjangoCompressWebpackStaticDeployCICD-ToolsSecStatic第一章:介绍Django静态文件的概念和重要性在Web开发中,静态文件......
  • C#中的System.Security.SecureString学习
    有一次在公司review代码时,有一个password的字段,原来用的是String类型,有同事提到应该用SecureString比较好于是我花了点时间了解了一下什么是SecureString,以及它与String类型的区别正常的String类型值,在脱离开作用域后,它的值在内存中并不会立即被销毁.这个时候,如果有人恶意扫......