django

django目录层级说明:

  manage.py--一个命令行工具,可以使我们用多种方式对Django项目进行设置
  project
    __init__.py--一个空文件,他告诉Python这个是一个包
    setting.py--配置文件
    urls.py--项目的url声明
    wsgi.py--项目与wsgi兼容的web服务器入口
基本操作:
  设计表结构:
    班级表
      表明(grade),字段[班级名称(gname),成立时间(gdate),学生总数(gnum),是否删除(isdelete)],
    学生表
      表明(student),字段[姓名(sname),性别(sgender),年龄(sage),所属班级(sgrate),是否删除](isdelete)
  配置数据库:--Django默认使用sqlite数据库
   在settings.py通过DATABASE选项进行数据库配置

    DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'baseName',
      'USER':'root',
      'PASSWORD':'123123',
      'HOST':'localhost',
      'PORT':'3306',
      }
    } 
  配置mysql
    在__init__.py中写入
      import pymysql
      pymysql.install_as_MySQLdb()
  创建项目:

    django-admin startproject proName
  创建应用:在一个项目中可以创建多个应用,每个应用进行一种业务处理
    cd my_projectName
    python manage.py startapp appName
    目录说明:
      admin.py--站点配置
      models.py--模型
      views.py--视图
  激活应用:
    在settings.py文件中,将app应用加入到INSTALLED_APPS中

  定义模型:
    有一个数据表,就对应有一个模型
    在models.py文件中定义模型
      from django.db import models
      模型类继承models.Model类
      class Grades(models.Model):
        gname = models.CharField(max_length=20)
        gdate = models.DateTimeField()
        gnum = models.IntegerField()
        isdelete = models.models.BooleanField()
      class Students(models.Model):
        sname = models.CharField(max_length=20)
        sgender = models..models.BooleanField()
        sage = models.IntegerField()
        #关联外键
        sgrade = models.ForeignKey('Grades',on_delete=models.)
        isdelete = models.models.BooleanField()
       说明:不需要定义主键,主键会在生成时自动添加

    生成数据表:
      生成迁移文件
      执行<python manage.py makemigrations>
      执行迁移
      <python manage.py migrate>

    测试数据操作:
      进入到python_shell环境--执行<python manage.py shell>
      引入包:
        from myApp.modesl import Grades,Students
        from django.utils import timezone
        frome datetime import *
      查询所有数据(类名.objects.all()):
        <Grades.objects.all()>

      添加数据:-本质:创建一个类的属性--创建对象
        <grade = Grades()
        grade.gname = 'python'
        ....>
        <grade.save()>
      查看某个对象:
        Grades.objects.get(pk=1)

      修改数据:
        grade.gname=''
        grade.save()
      删除:--物理删除,一般不使用
        grade.delete()
      关联对象:
        获取python班级的所有学生
        grade.students_set.all()
        创建学生属于哪个班级
        stu = grade.students_set.create(sname='xiaozhang',sage=11,sgender=1,isdelete=0)
        他会直接添加到数据库中

    启动服务器:
      格式--Python manage.py runserver ip:port
      这是一个纯Python写的轻量级web服务器,仅仅在开发环境中使用

    Admin站点管理:
      内容发布
      负责添加、修改、删除内容
      公共访问

    配置Admin应用:
      在setting.py 中 INSTALLED_APPS添加‘django.contrib.admin’
    创建管理员用户:
      进入目录
      python manage.py createsuperuser
      -->username
      -->email
      -->password
    汉化:
      settings.py -->LANGUAGE_CODE='zh-Hans'
      -->TIME_ZONE='Asia/Shanghai'

    管理数据表:
      修改admin.py文件
      from .models import Grades,Students

      #注册
      admin.site.register(Grades)
      admin.site.register(Students)

    自定义管理页面:
      列表页属性
      list_display = []
      list_filter = []
      search_fields = []
      list_per_page = []

    添加、修改页属性
      fields = []-属性的先后顺序
      fieldsets = []--分组

      fields与fieldsets不能同时使用

    关联对象:
      在创建一个班级时,可以直接创建几个学生
      class StudentsInfo(admin.TabularInline):
      model = Students
      extra = 2

      #注册
      class GradesAdmin(admin.ModelAdmin):
      #必须有外键才行
      inlines = [StudentsInfo]

    布尔值显示问题

      执行动作位置
      actions_on_bottom = True

    使用装饰器完成注册
      @admin.register(Students)-替换-
      admin.site.register(Grades,GradesAdmin)

    视图的基本使用
      在Django中,视图对web请求进行的响应
      视图就是一个python函数,在views.py中定义
      定义视图:
        from django.http import HttpResponse
        # Create your views here.
        def index(request):
        return HttpResponse('hahahahahahahahaha')
      配置url
        修改project目录下的urls.py文件
        在myapp目录下创建urls.py文件

    模板的基本使用:
      概述:模板是HTML页面,可以根据视图中传递过来的数据进行填充
      创建模板:在根目录下创建templates 目录,再创建myapp目录
      配置模板路径:
      修改settings.py文件-TEMPLATES-DIRS:[os.path.join(BASE_DIR,'templates')]

      定义班级和学生模板
        模板语法:
        {{输出值,可以是变量,也可以是对象.属性}}
        {%执行代码段%}


    流程梳理:
      创建工程目录 <django-admin startproject proName>
      进入工程目录
      创建项目 <python manage.py startapp myApp>
      激活项目 修改settings.py 中的INSTALL_APPS
      配置数据库
      修改__ini__.py文件
      修改settings.py文件中的DATABASES

      创建模型类 在项目目录下的models.py中添加类
      生成迁移文件 <python manage.py makemigrations>
      执行迁移 <python manage.py migrate>
      配置站点:
        创建模板目录、项目模板目录--templates
      在settings.py文件中创建模板路径:os.path.join(BASE_DIR,'templates')
      在project下修改urls.py
      在项目目录(myApp)下创建urls.py



    模型:models.py
      django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的api,可以根据不同的业务需求选择不同的数据库
      配置数据库
      project下的__init__() 文件中修改
        import pymysql
        pymysql.install_as_MySQLdb
      修改settings.py文件;

    开发流程:
      配置数据库
      定义模型类
      生成迁移文件
      执行迁移
      使用模型类进行crud操作
  ORM
    对象-关系-映射
    根据对象的类型生成表结构;将对象列表的操作转换为sql语句;将sql语句查询到的结果转换为对象列表
    极大的减轻了开发人员的工作量;不需要面对因数据库的变更而修改代码
    定义模型:
      模型、属性、表、字段间的关系
      一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对应表中的一个字段
    定义属性
      概述:
      Django根据属性的类型确定一下信息
      当前选择的数据库支持字段的类型
      渲染管理表单时使用的默认HTML空间
      在管理站点最低限度的验证
      Django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则Django不会再生成默认的主键列
    属性命名限制
      不能是python的关键字
      有与Django的查询方式,不用需使用连续的下划线
    库
      定义属性时,需要字段类型,字段类型被定义在Django.db.models.fields目录下,为了方便使用,被导入到Django.db.models中

    使用方式:
      导入 from django.db import models
      通过models.field 创建字段类型的对象,复制给属性
    逻辑删除---
    字段类型:
      autoField
        一个根据实际ID自动增长的IntegrField。通常不指定,如果不指定,一个主键字段将自动添加到模型中
        CharField(max_length)
        字符串,默认的表单样式是TextInput
      TextField
        文本字段,一般不超过4000,默认的表单控件是Textarea
      IntegerField 整数
        DecimalField(max_digits,None,decimal_places None)
        使用python的decimal实例表示的十进制浮点数
    参数说明:
      DecimalField.max_digits
        位数总数
      decimal_places
        小数点后的数字位数
      FloatField
        用python的float实例来表示的浮点数
      BooleanField
        true/false
      NullBooleanField
      DateField()
      TimeFeild()
      DateTimeField()
      FileField
        一个文件上传字段
      ImageField
        继承了FileField,但会校验,必须是图片
    字段选项:
      null--
      blanke--允许空白
      db_colum--字段名,
      db_index 创建索引
      default
      primary_key 主键
      unique 唯一约束
    关系:
    分类
      foreignKey-一对多,将字段定义在多的端
      ManyToManyField:多对多,定义在两端
      OneToOne 一对一,任意一段
    用一对多
      格式:
      对象.模型类小写_set
    实例:
      grade.students_set
    创建模型类:
      元选项:
      在模型类中定义Meta类,用于设置信息
      class Meta:
      db_table=''--定义数据表名,推荐小写字母,如果不写,数据表名默认为项目名_类名
      ordering=[]--对象的默认排序字段,获取对象的列表时使用
      ordering=['id]--升序
      ordering=['-id']--降序
      注意:排序会增加数据库的开销
    模型成员:
      类属性
        objects--Manager类型的对象,与数据库进行交互
        当定义模型类时没指定管理器,则Django为模型创建一个模型为objects的管理器
    自定义管理器:
      stuObj = models.Manager()
      当自定义模型管理器,objects就不存在了
      自定义管理器Manager类
      模型管理器是Django的模型进行与数据库交互的接口,一个模型可以有多个模型管理器
      作用:向管理器类中添加额外的方法
    修改管理器返回的原始查询集
      重写get_queryset()方法
      class StudentsManager(models.Manager):
        def get_queryset(self):
          return super(StudentsManager,self).get_queryset().filter(isDelete=False)
    创建对象
      向数据库中添加数据
      当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时才与数据库进行交互,将对象保存到数据库中
      __init__()已经在基类(model.Model)中使用,在自定义的模型中无法使用
    方法:
      在模型类中添加一个类方法
      @classmethod
      def createStudetn(cls):
    在自定义管理器中添加一个方法
    数据查询:
      查询集-表示从数据库中获取的对象的集合
      查询集可以有多个过滤器
      过滤器就是一个函数,基于所给的参数限制查询机结果
      从sql角度来说,查询机与select语句等价,过滤器就像where条件

      查询集:
        在管理器上调用过滤器方法返回查询集
        查询集经过过滤器筛选后返回新的查询集,所以可以写成链式调用
        惰性执行--在创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据
        直接访问数据的情况:
          迭代
          序列化
          与if合用
          返回查询集的方法称为过滤器
          all() --
          filter()--返回符合条件的数据
          filter(键=值)
          filter(键=值,键=值)
          filter(键=值),filter(键=值)
          exclude() --过滤符合条件的数据
          order_by()--排序
          values()--一条数据就是一个字典,多个数据就返回一个列表
    返回单个数据
      get ()--返回一个满足条件的对象
        如果没有找到符合条件的对象,模型类会引发模型类.doesNotExists异常
        如果找到多条,也会引发一个异常模型类.MultipleObjectReturned
      count()-- 返回当前查询集中的对象个数
      first()--返回查询集中的第一个数据
      last()--最后一个
      exists()--判断查询集是否有数据,如果有,则True
    限制查询集:
      查询集返回列表,可以使用返回下表的方法进行限制,相当limit
      Studetns.objects.all()[0:5]
      注意:下标不能为负数

    查询集的缓存:
      每个查询集都包含一个缓存,来最小化的对数据库访问
      在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,Django会将查询出来的数据进行缓存,并返回查询结果。以后的查询直接使用缓存
    字段查询:
      概述 :实现了sql语句中的where语句,作为方法filter(),exclude(),get()的参数


    属性名称__运算符=值
      age__> = 20
    外键
      属性名_id
    转义:类似sql 中的like语句
      filter(sname__contains=%)
    比较运算符
      exact--判断,大小写敏感
      filter(isDelete=False)
      contians--是否包含,大小写敏感
      Students.objects.filter(sname__contains='张')
      startswith,endwith 以--开头或结尾
      Students.objects.filter(sname__startsWith='张')
      以上四个在前面加上一个i,表示不区分大小写(icontians....)

      isnull,isnotnull--是否为空
      ..filter(sname__isnull=False)
      in -- 是否包含
      ..filter(pk__in=2,4,6)
      gt--大于
      gte--大于等于
      lt--小于
      lte--小于等于
      ..filter(sage__gt=30)
      ...
      year
      month
      day
      week_day
      hour
      minute
      second
      ..filter(lastTime__year=2019)
    跨关联查询:
      处理join查询
      模型类名__属性名__比较运算符
        grade = Grades.objects.filter(students__sname__contains='xiaozhang')--查询xiaozhang的班级

    查询快捷--pk--代表主键

    聚合函数
      使用aggregate()函数返回聚合函数的值
      Avg--平均
      Count--
      Max
      Min
      Sum
      from django.db,models import Max
      maxAge = Students.objects.aggregate(Max(sage)


    F对象
      可以使用模型的A属性与B属性进行比较
      from django.db,models import F,Q
      Grades.objects.filter(ggirlnum__gt=F('gboynum'))
      支持对象的算术运算
      Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)

    Q对象
      过滤器的方法中的关键字参数,条件为and模式
      进行or查询
      使用Q对象
      Students.objects.filter(Q(pk__lt=3) | Q(sage__gt=50))
      只有一个Q对象,就是用于匹配
      Students.objects.filter(Q(pk__lt=3))--> Students.objects.filter(pk__lt=3)

      Students.objects.filter(~Q(pk__lt=3))--取反(非)



出现以下错误:
File "E:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\mysql\operations.py", line 146, in last_executed_query
query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'
把该文件下的第。。行的decode改为encode

 

posted @ 2019-07-02 21:22  yi35  阅读(125)  评论(0)    收藏  举报