Django && Django rest framework(DRF)
最少的语言描述Django?
将数据库的东西通过ORM的映射取出来,通过view文件,按照template文件排出的模板渲染成HTML。当用户请求相应的url时,返回相应的结果。
最少语言描述DRF?
将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json。
最少语言描述DRF在Django的基础上做了什么?
DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能。
pip install django
pip install djangorestframework
django-admin startproject api_drf
cd api_drf
python manage.py startapp api
#settings.py
INSTALLED_APPS = (
...
'rest_framework',
)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'lcpapi', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
#__init__.py
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
表模型,一个类对应一个数据表
from django.db import models
type_choice = (
(0, 'INTEL'),
(1, 'AMD')
)
multiply_choice=(
(0, 1.0),
(1, 1.1),
(2, 1.2),
)
duration_choice=(
(0,1),
(1,2)
)
class CPU(models.Model):
'''模型字段'''
partnumber = models.CharField(max_length=128, verbose_name='partnumber', unique=True)
featurecode = models.CharField(max_length=32, null=False, verbose_name='featurecode')
name = models.CharField(max_length=128, verbose_name='name')
idle = models.FloatField(null=False, verbose_name='idle')
idle_rate = models.FloatField(null=False, verbose_name='idle_rate')
max = models.FloatField(null=False, verbose_name='max')
max_rate = models.FloatField(null=False, verbose_name='max_rate')
max_efficiency = models.FloatField(null=False, verbose_name='max_efficiency')
type = models.IntegerField(choices=type_choice, verbose_name='type')
multiply = models.IntegerField(choices=multiply_choice, verbose_name='multiply', blank=False)
term_duration = models.IntegerField(choices=duration_choice, verbose_name='term_duration', blank=False)
class Meta:
db_table = "cpulist"
verbose_name = "cpulist"
verbose_name_plural = verbose_name
作用:
from rest_framework.serializers import ModelSerializer
from api import models
from api.models import CPU
class CPUSerializer(ModelSerializer):
class Meta:
model = CPU
# fields = ['id', 'partnumber', 'featurecode', 'name',
# 'idle', 'idle_rate', 'max','max_rate','max_efficiency',
# 'type','multiply','term_duration'
# ]
fields = '__all__'
extra_kwargs = {
"id": {
"read_only": True
}
}
def create(self, validated_data): # 调用Serializer必须重写create方法
res = models.CPU.objects.create(**validated_data)
return res
使用序列化器操作models.py中定义的数据表,返回序列化好的json。
get/post/put/patch/delete
from rest_framework.response import Response
from rest_framework.views import APIView
from api import models
from api.serializers import CPUSerializer
class CPU(APIView):
response = {'code':100, 'msg':'查询成功'}
def get(self,request):
cpus = models.CPU.objects.all()
# 注instance用于接受序列化的对象,many表示是queryset对象,如果是多条,就是many=True,如果是单个对象,就不写
cpus_serializer = CPUSerializer(instance=cpus, many=True)
return Response(cpus_serializer.data) #cpus_serializer.data就是序列化后的字典
def get_by_id(self, request, id):
res = models.CPU.objects.all().filter(id=id).first()
ser = CPUSerializer(instance=res)
return Response(ser.data)
def post(self,request):
res = request.data # post提交的是数据都在这里,是一个字典
ser = CPUSerializer(data=res) # 这里针对数据往哪个表存识别不了,所以在序列化类里需要重写create方法
# 校验字段
if ser.is_valid():
ser.save() # 调用save保存到数据库
return Response(ser.data)
else:
return Response(ser.errors) # 如果校验不通过返回错误信息
视图views和路由的映射
from django.contrib import admin
from django.urls import path, re_path
from api import views
urlpatterns = [
path('admin/', admin.site.urls),
path('cpus/', views.CPU.as_view()),
re_path(r'cpu/(?P\d+)' ,views.CPU.as_view()),
]
python manage.py makemigrations #记录下models.py的变更记录
python manage.py migrate #变更记录同步到数据库
python manage.py runserver #启动server
Django model中的class Meta
Django model中的class Meta详解
ordering=['order_date']
# 按订单升序排列
ordering=['-order_date']
# 按订单降序排列,-表示降序
ordering=['?order_date']
# 随机排序,?表示随机
ordering = ['-pub_date', 'author']
# 对 pub_date 降序,然后对 author 升序
unique_together = (("first_name", "last_name"),)
verbose_name = "pizza"
verbose_name_plural = "pizzas"
Django 序列化器中的class Meta
ModelSerializer和Serializer的区别
ModelSerializer 类相比 Serializer 类添加了以下功能: