1,创建django项目
django-admin startproject 项目名
2,创建django应用
django-admin startapp 应用名
3,做配置 settings.py
3.1 注册应用
INSTALLED_APPS = [
.....
'rest_framework',
'corsheaders',
'新建的应用名'
]
3.2 后端跨域
corsheaders.middleware.CorsMiddleware
3.2.1 安装corsheaders
pip install django-cors-headers
3.2.2 注册
INSTALLED_APPS = [
.....
'corsheaders',
]
3.2.3 增加中间件 corsheaders.middleware.CorsMiddleware
需要在CommonMiddleware
在他上面
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
]
3.2.4 允许所有的源跨域
CORS_ORIGIN_ALLOW_ALL = True
配置数据库
DATABASES = [
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'haoyouduo',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'root',
}
]
项目本地化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
静态文件位置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
指定文件上传的位置
MEDIA_ROOT = [
os.path.join(BASE_DIR,'static'),
]
4,路由 (一级路由/系统路由+二级路由/应用路由)
一级路由/系统路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('fruit/', include('fruit.urls')),
]
二级路由/应用路由
from django.urls import path
from . import views
urlpatterns = [
path('login/', view.LoginView.as_view()),
]
浏览器该如何去访问?
一级路由+二级路由=>
http://127.0.0.1:80000/fruit/login/
slashed 出现类似于这样的关键字 路由中少斜线
5, 数据模型
- 模型的字段
CharField 字符串 varchar()
IntegerField 整型 => int(11)
DateTimeField 时间类型 =>datetime()
DecimalField 财务类型 => decimal()
BooleanField 布尔类型 =>tinyint(1)
SmallIntegerField 小整型 =》 int(6)
ImageField 图片类型 => varchar()
AutoField 自增字段
ForeignKey 外键
ManyToManyField 多对多
6,属性
max_length 最大的长度 一般放在CharField里面
max_digits 和 decimal_places 一般放在 DecimalField里面
unique 唯一索引
auto_now_add 默认当前时间,时间字段第一次添加记录的时间
auto_add 默认当前时间,时间字段每次改变的记录的时间
default 默认值
upload_to 文件上传的地址
on_delete CASCADE级联删除 DO_NOTHING 什么都不做
7,元选项
class Demo(model.Model):
name = models.CharField(max_length=32,unique=True)
class Meta:
db_table = 'demo'
ordering = ["-id","-name"]
abstract = True
db_table : 指定一个表名
ordering : 对指定的字段进行排序,一般使用的是列表
abstract : 抽象,如果为True,它只是一个公共类,让子类继承,不会产生新表。为Flase,就会生成新表
8,视图函数
FBV 基于函数的视图
def index(request):
return HttpResponse("")
CBV 基于类的视图
from django.view import View
class DemoView(View):
def get(self,request):
return HttpResponse("")
序列化 一般是在数据库或者其他地方将数据读出来经过处理转成json结构返回给前端供其使用。
from rest_framework import serializers
from . import models
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = '__all__'
反序列化 第一种方式
ModelSerializer 继承 Serializer
from rest_framework import serializers
from . import models
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = '__all__'
关联关系
一对多
class Category(models.Model):
name = models.CharField(max_length=32)
class Goods(models.Model):
name = models.CharField(max_length=32)
cate = models.ForignKey('Category',on_delete=models.CASCADE)
正向读值(站在外键的这个类中) 对象.外键.关联类的字段
goodobj = models.Goods.objects.filter(id=1).first()
goodobj.cate.name # 得到的是分类的名称
反向读值(站在类的角度上来获取这个类下有什么商品) 对象.类名的小写_set.all()
cateobj = models.Category.objects.filter(id=1).first()
cateobj.goods_set.all() # 该分类下的所有的商品
多对多 一个商品属于多个类 一个类下有多个商品
class Category(models.Model):
name = models.CharField(max_length=32)
class Goods(models.Model):
name = models.CharField(max_length=32)
cate = models.ManyToManyField(to='Category')
正向取值(商品属于哪个类?)
goodobj = models.Goods.objects.filter(id=1).first()
goodobj.cate.all() # 该商品属于的分类的集合
反向取值(这个类下有多少商品)
cateobj = models.Category.objects.filter(id=1).first()
cateobj.goods_set.all() # 该分类下有多少商品
- 分页
0 获取当前页
p = request.GET.get("p",1)
1 导包
from django.core.paginator import Paginator
2 获取需要分页的数据
userqueryset = models.User.objects.all()
3 实例化分页
page_obj = Paginator(userqueryset,per_page=5)
# 4 获取分页的范围
page = [i for i in page_obj.page_range]
# 5 获取当前页的数据
page_data = page_obj.page(p)
# 6 判断是否有上一页和下一页
previous = page_data.has_previous()
next = page_data.has_next()
# 7 对当前页的数据进行序列化 xxx就是写好的序列化
obj = xxx(page_data,many=True)
# 8 构造数据
data = {
"data":obj.data,
"page":page,
"previous":previous,
"next":next
}
# 9 返回
return Response(data)
中间件
from django.utils.deprecation import MiddlewareMixin
2 自定义中间件
class CustomMiddlewareMixin(MiddlewareMixin):
# 1
def process_request(self,request):
'''
逻辑过程
'''
pass
2
def process_view(self,request):
pass
# 3
def process_template_view(self,request,response):
return response
# 4
def process_exception(self,reqeust):
pass
# 5
def process_response(self,request,response):
'''
逻辑过程
'''
return response
3 注册到settings.py
MIDDLEWARE = [
......
'xxx.xxx.xxxx',
]