Django基础

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',
]

原文地址:https://www.cnblogs.com/2193657219qq/p/13887294.html