Django 第十二章 第三方功能应用

1.Django Rest Framework框架

先安装Django Rest Framework框架 pip install djangorestframework
在setting.py中进行配置

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
    # 添加Django Rest Framework框架
    'rest_framework'
]
# Django Rest Framework框架设置信息
# 分页设置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    # 每页显示多少条数据
    'PAGE_SIZE': 2
}

定义项目模型

from django.db import models


class PersonInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    hireDate = models.DateField()

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '人员信息'


class Vocation(models.Model):
    id = models.AutoField(primary_key=True)
    job = models.CharField(max_length=20)
    title = models.CharField(max_length=20)
    payment = models.IntegerField(null=True, blank=True)
    name = models.ForeignKey(PersonInfo, on_delete=models.Case)

    def __str__(self):
        return str(self.id)

    class Meta:
        verbose_name = '职业信息'

对模型执行数据迁移

1.1 序列化类Serialize

在应用中serializers.py定义序列化类MySerializer

from rest_framework import serializers
from .models import PersonInfo, Vocation

# 定义Serializer类
# 设置模型Vocation的字段name的下拉内容
nameList = PersonInfo.objects.values('name').all()
NAME_CHOICES = [item['name'] for item in nameList]
class MySerializer(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.ChoiceField(choices=NAME_CHOICES, default=1)
    # 模型Vocation的字段name是外键字段,它指向模型PersonInfo
    # 因此外键字段可以使用PrimaryKeyRelatedField
    name = serializers.PrimaryKeyRelatedField(queryset=nameList)

    # 重写create函数,将API数据保存到数据表index_vocation
    def create(self, validated_data):
        return Vocation.objects.create(**validated_data)

    # 重写update函数,将API数据更新到数据表index_vocation
    def update(self, instance, validated_data):
        return instance.update(**validated_data)

设置路由信息


from django.urls import path
from .views import *
urlpatterns = [
    # 视图函数
    path('', vocationDef, name='myDef'),
    # 视图类
    path('myClass/', vocationClass.as_view(), name='myClass'),
]

定义视图

from .models import PersonInfo, Vocation
from .serializers import MySerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import api_view


@api_view(['GET', 'POST'])
def vocationDef(request):
    if request.method == 'GET':
        q = Vocation.objects.all()
        # 分页查询,需要在settings.py设置REST_FRAMEWORK属性
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request)
        # 将分页后的数据传递MySerializer,生成JSON数据对象
        serializer = MySerializer(instance=p, many=True)
        # 返回对象Response由Django Rest Framework实现
        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:
            # 修改数据
            MySerializer().update(instance, data)
        else:
            # 创建数据
            MySerializer().create(data)
        return Response('Done', status=status.HTTP_201_CREATED)


class vocationClass(APIView):
    # GET请求
    def get(self, request):
        q = Vocation.objects.all()
        # 分页查询,需要在settings.py设置REST_FRAMEWORK属性
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request, view=self)
        serializer = MySerializer(instance=p, many=True)
        # 返回对象Response由Django Rest Framework实现
        return Response(serializer.data)

    # POST请求
    def post(self, request):
        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:
            # 修改数据
            MySerializer().update(instance, data)
        else:
            # 创建数据
            MySerializer().create(data)
        return Response('Done', status=status.HTTP_201_CREATED)

若使用视图函数开发API接口,必须对视图函数使用装饰器api_view,若使用视图类,对GET请求和POST请求进行不同的处理。

1.2 模型序列化类ModelSerializer

为了简化序列化类Serializer的定义过程,Django Rest Framework定义了模型序列化类ModelSerializer
以上节例子为例,将自定义的MySerializer改为VocationSerializer

from rest_framework import serializers
from .models import Vocation

# 定义ModelSerializer类
class VocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vocation
        fields = '__all__'
        # fields = ('id', 'job', 'title', 'payment', 'name')

重新定义视图

from .models import PersonInfo, Vocation
from .serializers import VocationSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import api_view


@api_view(['GET', 'POST'])
def vocationDef(request):
    if request.method == 'GET':
        q = Vocation.objects.all().order_by('id')
        # 分页查询,需要在settings.py设置REST_FRAMEWORK属性
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request)
        # 将分页后的数据传递MySerializer,生成JSON数据对象
        serializer = VocationSerializer(instance=p, many=True)
        # 返回对象Response由Django Rest Framework实现
        return Response(serializer.data)
    elif request.method == 'POST':
        # 获取请求数据
        id = request.data.get('id', 0)
        # 判断请求参数id在模型Vocation是否存在
        # 若存在,则执行数据修改,反之新增数据
        operation = Vocation.objects.filter(id=id).first()
        # 数据验证
        serializer = VocationSerializer(data=request.data)
        if serializer.is_valid():
            if operation:
                data = request.data
                id = data['name']
                data['name'] = PersonInfo.objects.filter(id=id).first()
                serializer.update(operation, data)
            else:
                # 保存到数据库
                serializer.save()
            # 返回对象Response由Django Rest Framework实现
            return Response(serializer.data)
        return Response(serializer.errors, status=404)


class vocationClass(APIView):
    # GET请求
    def get(self, request):
        q = Vocation.objects.all().order_by('id')
        # 分页查询,需要在settings.py设置REST_FRAMEWORK属性
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request, view=self)
        serializer = VocationSerializer(instance=p, many=True)
        # 返回对象Response由Django Rest Framework实现
        return Response(serializer.data)

    # POST请求
    def post(self, request):
        # 获取请求数据
        id = request.data.get('id', 0)
        operation = Vocation.objects.filter(id=id).first()
        # 数据验证
        serializer = VocationSerializer(data=request.data)
        if serializer.is_valid():
            if operation:
                data = request.data
                id = data['name']
                data['name'] = PersonInfo.objects.filter(id=id).first()
                serializer.update(operation, data)
            else:
                # 保存到数据库
                serializer.save()
            # 返回对象Response由Django Rest Framework实现
            return Response(serializer.data)
        return Response(serializer.errors, status=404)

1.3 序列化的嵌套使用

在开发过程中需要对多个JSON数据进行嵌套,比如将模型PersonInfo和Vocation的数据组合放在同一个JSON数据转,两个模型的数据通过外键字段name进行关联。以上节例子为例,在serializer.py中定义PersonInfoserializer,Vacationserializer

from rest_framework import serializers
from .models import Vocation, PersonInfo


# 定义ModelSerializer类
class PersonInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = PersonInfo
        fields = '__all__'


# 定义ModelSerializer类
class VocationSerializer(serializers.ModelSerializer):
    name = PersonInfoSerializer()
    class Meta:
        model = Vocation
        fields = ('id', 'job', 'title', 'payment', 'name')

    def create(self, validated_data):
        # 从validated_data获取模型PersonInfo的数据
        name = validated_data.get('name', '')
        id = name.get('id', 0)
        p = PersonInfo.objects.filter(id=id).first()
        # 根据id判断模型PersonInfo是否存在数据对象
        # 若存在数据对象,只对Vocation新增数据
        # 若不存在,首先对模型PersonInfo新增数据
        # 然后再对模型Vocation新增数据
        if not p:
            p = PersonInfo.objects.create(**name)
        data = validated_data
        data['name'] = p
        v = Vocation.objects.create(**data)
        return v

    def update(self, instance, validated_data):
        # 从validated_data获取模型PersonInfo的数据
        name = validated_data.get('name', '')
        id = name.get('id', 0)
        p = PersonInfo.objects.filter(id=id).first()
        # 判断外键name是否存在模型PersonInfo
        if p:
            # 若存在,首先更新模型PersonInfo的数据
            PersonInfo.objects.filter(id=id).update(**name)
            # 然后更新模型Vocation的数据
            data = validated_data
            data['name'] = p
            id = validated_data.get('id', '')
            v = Vocation.objects.filter(id=id).update(**data)
            return v

序列化类VocationSerializer对 PersonInfoSerializer进行实例化并赋值给变量name,而属性fileds的name代表模型Vocation的外键字段name,同时也是变量name。、
调整视图函数代码

from .models import Vocation
from .serializers import VocationSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import api_view


@api_view(['GET', 'POST'])
def vocationDef(request):
    if request.method == 'GET':
        q = Vocation.objects.all().order_by('id')
        # 分页查询,需要在settings.py设置REST_FRAMEWORK属性
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request)
        # 将分页后的数据传递MySerializer,生成JSON数据对象
        serializer = VocationSerializer(instance=p, many=True)
        # 返回对象Response由Django Rest Framework实现
        return Response(serializer.data)
    elif request.method == 'POST':
        # 获取请求数据
        id = request.data.get('id', 0)
        # 判断请求参数id在模型Vocation是否存在
        # 若存在,则执行数据修改,反之新增数据
        operation = Vocation.objects.filter(id=id).first()
        # 数据验证
        serializer = VocationSerializer(data=request.data)
        if serializer.is_valid():
            if operation:
                serializer.update(operation, request.data)
            else:
                # 保存到数据库
                serializer.save()
            # 返回对象Response由Django Rest Framework实现
            return Response(serializer.data)
        return Response(serializer.errors, status=404)


class vocationClass(APIView):
    # GET请求
    def get(self, request):
        q = Vocation.objects.all().order_by('id')
        # 分页查询,需要在settings.py设置REST_FRAMEWORK属性
        pg = PageNumberPagination()
        p = pg.paginate_queryset(queryset=q, request=request, view=self)
        serializer = VocationSerializer(instance=p, many=True)
        # 返回对象Response由Django Rest Framework实现
        return Response(serializer.data)

    # POST请求
    def post(self, request):
        # 获取请求数据
        id = request.data.get('id', 0)
        operation = Vocation.objects.filter(id=id).first()
        # 数据验证
        serializer = VocationSerializer(data=request.data)
        if serializer.is_valid():
            if operation:
                serializer.update(operation, request.data)
            else:
                # 保存到数据库
                serializer.save()
            # 返回对象Response由Django Rest Framework实现
            return Response(serializer.data)
        return Response(serializer.errors, status=404)

2.验证码生成与使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常用的Python第三方库: 1. NumPy:用于进行科学计算和数值操作的库。 2. Pandas:用于数据分析和处理的库,提供了高效的数据结构和数据操作工具。 3. Matplotlib:用于绘制各种类型的图表和可视化的库。 4. Scikit-learn:用于机器学习和数据挖掘的库,提供了各种常用的机器学习算法和工具。 5. TensorFlow:用于构建和训练深度学习模型的库。 6. Keras:基于TensorFlow或Theano的高级神经网络API,用于快速构建和训练深度学习模型。 7. Flask:用于构建Web应用程序的轻量级框架。 8. Django:用于构建复杂Web应用程序的全功能框架。 9. Requests:用于发送HTTP请求和处理响应的库。 10. BeautifulSoup:用于解析HTML和XML文档的库,常用于网页爬虫和数据抓取。 11. SQLAlchemy:用于在Python中操作关系型数据库的库,提供了高级的对象关系映射(ORM)功能。 12. Pygame:用于开发2D游戏的库。 13. OpenCV:用于计算机视觉和图像处理的库,提供了各种图像处理和计算机视觉算法。 14. Scrapy:用于构建和运行网络爬虫的框架,可用于抓取和提取网页数据。 15. NLTK:自然语言处理工具包,提供了各种文本处理和分析的功能。 你可以使用以下命令安装这些库: ```shell pip install numpy pip install pandas pip install matplotlib pip install scikit-learn pip install tensorflow pip install keras pip install flask pip install django pip install requests pip install beautifulsoup4 pip install sqlalchemy pip install pygame pip install opencv-python pip install scrapy pip install nltk ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值