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

  • 相关阅读:
    postgresql 高可用 etcd + patroni 之八 haproxy + keepalived
    postgresql 高可用 etcd + patroni 之七 haproxy
    postgresql 索引之 gin
    postgresql 索引之 btree
    postgresql 物理备份 barman 之 rsync/ssh backup
    postgresql 物理备份 barman 之 streaming backup
    postgresql 物理备份 barman 之 安装
    postgresql 的 .pgpass密码文件的使用
    postgresql 的 pg_hba.conf 的行记录顺序
    ubuntu 16.04 进入单用户模式
  • 原文地址:https://www.cnblogs.com/2193657219qq/p/13887294.html
Copyright © 2020-2023  润新知