【Python】DRF Django Rest Framework

1.环境安装与配置

DRF需要以下依赖:

  • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)

  • Django (1.10, 1.11, 2.0)

pip list -- 查看 Django 版本

DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境无需从新创建。(若没有Django环境,需要先创建环境安装Django)

2.安装DRF

python 项目终端

pip install djangorestframework

3. settings.py 配置

# 添加'rest_framework'到您的INSTALLED_APPS设置中。

INSTALLED_APPS = [  

        ...    'rest_framework',

]

4.什么是 ModelSerializer:

​ 序列化:一般是在数据库或者其他地方将数据读出来经过处理转成json结构返回给前端供其使用。

​ ModelSerializer 是对 serializers 的进一步封装;

5.eg:案例 

`url.py`

from rest_framework import routers
from myApp.views import *

urlpatterns = []

router = routers.SimpleRouter(trailing_slash=False)
# 类别
router.register("category", CategoryView, basename="routers")
# 小类
router.register("subclass", SubclassView, basename="subclass")
urlpatterns += router.urls
print(urlpatterns)

`models.py`

from django.db import models
# Create your models here.

# 类别
class CategoryModel(models.Model):
    title = models.CharField('标题', max_length=255)

    class Meta:
        db_table = 'category'
        ordering = ['id']


# 小类
class SubclassModel(models.Model):
    title = models.CharField('标题', max_length=255)
    content = models.CharField('内容', max_length=255)
    # 类别外键  related_name='category_ref'
    category = models.ForeignKey(
        to=CategoryModel,
        on_delete=models.CASCADE
    )
    region = models.CharField('地区', max_length=255)

    class Meta:
        db_table = "subclass"

`serializers.py`

首先,我们需要了解正向查询和反向查询的概念

正向查询:使用有外键模型对象去查询没有外键的关联对象   模型对象.外键属性

反向查询:使用没有外键的模型对象去查询有外键的关联对象  模型对象.关联的模型类名_set

from rest_framework import serializers
from myApp.models import *


# 种类嵌套序列化器子类
class CategorySerializerChild(serializers.ModelSerializer):
    class Meta:
        model = CategoryModel  # model  序列化的 模型
        """
            fields 序列化的字段(要显示的字段)
            fields =   ('name',)  只显示该字段,注意  是个元组; 
            fields  = ['name']  和 上面元组 意思一样
        """
        fields = "__all__"


# 小类嵌套序列化器
class SubclassSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    # 添加数据的时候使用; _id 是默认生成的小名, 在数据中可以查看。
    category_id = serializers.IntegerField(write_only=True)

    """
        1. StringRelatedField
            在 models 中与 __str__ 魔法方法配合使用获取 类别的 title 类别标题
            category = serializers.StringRelatedField(read_only=True)
        2.PrimaryKeyRelatedField
            获取 主表 id 数据
            category = serializers.PrimaryKeyRelatedField(read_only=True)
        3. 嵌套序列化器 从表获取主表关联的数据集合 (正向查询)
            category = CategorySerializerChild(read_only=True)
            
    """
    category = CategorySerializerChild(read_only=True)

    class Meta:
        model = SubclassModel
        fields = "__all__"


# 小类 嵌套序列化器子类
class SubclassSerializerChild(serializers.ModelSerializer):
    class Meta:
        model = SubclassModel
        fields = "__all__"


# 类别嵌套序列化器
class CategorySerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    """
       todo: 另外一种实现方式  
            在外键(ForeignKey)的定义中,我们可以通过设置related_name参数, 
            来覆盖名字subclassmodel_set (相当于别名的作用) 以起到相同的作用。
            
       1. model外键字段配合序列化器返回数据 
            category = models.ForeignKey( 
                to=CategoryModel,
                on_delete=models.CASCADE
                related_name='category_ref'
            )
       2. 序列化器: 
            category_ref = SubclassSerializer(read_only=True, many=True)
    """
    # 嵌套序列化器 反向查询
    subclassmodel_set = SubclassSerializerChild(read_only=True, many=True)

    class Meta:
        model = CategoryModel
        fields = "__all__"

`views.py`

from django.shortcuts import render
from rest_framework import filters
from rest_framework.viewsets import ModelViewSet
from myApp.models import *
from myApp.serializers import *


# 分页
from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
    page_size = 5
    page_query_param = 'page'
    page_size_query_param = 'page_size'
    max_page_size = 10
    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('results', data)
        ]))

# 类别
class CategoryView(ModelViewSet):
    queryset = CategoryModel.objects.all()
    pagination_class = MyPagination
    serializer_class = CategorySerializer
    # 模糊查询 
    filter_backends = [filters.SearchFilter]
    search_fields = ['id']


# 小类
class SubclassView(ModelViewSet):
    queryset = SubclassModel.objects.all()
    serializer_class = SubclassSerializer

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值