• django学习笔记(二)基本流程一



    选择一个路径存放
    进入所在路径 ,输入django-admin startproject project

    一 、配置数据库

    在projectproject目录下
    注意:django默认是sqlite

    1、python3安装的是pymysql

    2、在__init__.py文件中写入两行代码

    import pymysql
    pymysql.install_as_MySQLdb()

    3、在settings.py中,通过DATABASES配置下面代码

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':  'sunck',    #你的数据库名称
            'USER': 'root',   #你的数据库用户名
            'PASSWORD': '123456', #你的数据库密码
            'HOST': '', #你的数据库主机,留空默认为localhost
            'PORT': '3306', #你的数据库端口
        }
    }

    4、创建应用

    1. 在一个项目中可以创建多个应用,每个应用进行一种业务处理
    2. 打开黑屏终端进入D:programpython3Django_learningproject 目录下,输入tree . /F
      得到
    卷 新加卷 的文件夹 PATH 列表
    卷序列号为 087B-F38B
    D:PROGRAMPYTHON3DJANGO_LEARNINGPROJECT
    │  manage.py
    │
    └─project
            asgi.py
            settings.py
            urls.py
            wsgi.py
            __init__.py
    1. 接下来输入python manage.py startapp firstapp回车
      遇到一下问题

    File “C:UsersDELLAppDataLocalProgramsPythonPython37libsite-packagesdjango-3.0.4-py3.7.eggdjangodbackendsmysqlase.py”, line 37, in
    raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

    在C:UsersDELLAppDataLocalProgramsPythonPython37Libsite-packagesDjango-3.0.4-py3.7.eggdjangodbackendsmysql目录下找到base.py,将里面两行代码像我这样注释掉
    在这里插入图片描述
    继续输入python manage.py startapp firstapp回车,和下图一样则表示改成功了

    在这里插入图片描述
    在project目录下输入tree . /F,得到下图

    │  manage.py
    │
    ├─firstapp
    │  │  admin.py
    │  │  apps.py
    │  │  models.py
    │  │  tests.py
    │  │  views.py
    │  │  __init__.py
    │  │
    │  └─migrations
    │          __init__.py
    │
    └─project
        │  asgi.py
        │  settings.py
        │  urls.py
        │  wsgi.py
        │  __init__.py
        │
        └─__pycache__
                settings.cpython-37.pyc
                urls.cpython-37.pyc
                __init__.cpython-37.pyc

    4.firstapp目录说明

    • admin.py 站点配置
    • models.py 模型
    • views.py 视图

    5、激活应用

    在settings.py文件中,将firstapp应用加入到INSTALLED_APPS选项中

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'firstapp'#加入的应用名
    ]

    6、定义模型

    1、有一个数据表,就对应有一个模型
    2、在models.py文件中定义模型,是为了与数据库进行一个交互
    在firstapp文件下models.py中定义模型-------引入from django.db import models
    --------模型类 要继承models.Model类
    类里面的属性对应表里面的字段
    3、在 models.py 中定义

    from django.db import models
    # Create your models here.
    
    class Grades(models.Model):
        gname = models.CharField(max_length=20)
        gdate = models.DateTimeField()
        gnum  = models.IntegerField()#人数
        isDelete =models.BooleanField(default=False)#是否删除
        
    class Students(models.Model):
        sname = models.CharField(max_length=20)
        sgender = models.BooleanField(default=False)#性别
        sage = models.IntegerField()#年龄
        scontend =models.CharField(max_length=20)#学生简介
        isDelete =models.BooleanField(default=False)#是否删除
        #关联外键
        sgrade = models.ForeignKey("Grades")
        

    4、不需要定义主键,在生成时自动添加,并且值为自动增加的

    7、在数据库中生成数据表

    第一步生成迁移文件

    在migrantions目录下生成一个迁移文件,此时数据库还没有生成数据表,可以在第一步结束之后,去sunck数据库下看看有没有数据表
    1、(1)在project目录下,执行一个命令 python manage.py makemigrations
    执行出错:

     File "D:programpython3Django_learningprojectfirstappmodels.py", line 17, in Students
        sgrade = models.ForeignKey("Grades")
    TypeError: __init__() missing 1 required positional argument: 'on_delete'

    (2)修改代码:

    定义外键的时候需要加上 on_delete=;

    sgrade = models.ForeignKey("Grades",on_delete=models.CASCADE)

    django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:

    TypeError: init() missing 1 required positional argument: ‘on_delete’

    由于多对多(ManyToManyField)没有 on_delete 参数,所以以上只针对外键(ForeignKey)和一对一(OneToOneField)

    on_delete各个参数的含义如下:

     on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
     on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
     on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
     on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError
     # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
     on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
     # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
     on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
     on_delete=models.SET,         # 删除关联数据,
      a. 与之关联的值设置为指定值,设置:models.SET()
      b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    

    2、(1)在project目录下,执行一个命令
    python manage.py makemigrations
    出现警告:

    C:UsersDELLAppDataLocalProgramsPythonPython37libsite-packagespymysqlcursors.py:170: Warning: (3135, "'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.")
      result = self._query(query)
    Migrations for 'firstapp':
      firstappmigrations001_initial.py
        - Create model Grades
        - Create model Students

    (2)修改配置(注意必须时英文状态下输入符号)
    下面就是default_storage_engine=INNODB’附近粗错,可以检查符号

    "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',default_storage_engine=INNODB' at line 1")

    django原来的连接数据库配置设置如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':  'sunck',    #你的数据库名称
            'USER': 'root',   #你的数据库用户名
            'PASSWORD': '123456', #你的数据库密码
            'HOST': '', #你的数据库主机,留空默认为localhost
            'PORT': '3306', #你的数据库端口
            'OPTIONS':{'init_command':'SET sql_mode="STRICT_TRANS_TABLES",storage_engine=INNODB;'}  #设置数据库为INNODB,为第三方数据库登录用
                },
        }
    }
    

    修改后的代码如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':  'sunck',    #你的数据库名称
            'USER': 'root',   #你的数据库用户名
            'PASSWORD': '123456', #你的数据库密码
            'HOST': '', #你的数据库主机,留空默认为localhost
            'PORT': '3306', #你的数据库端口
            'OPTIONS': {
                'init_command': "SET sql_mode='traditional',default_storage_engine=INNODB;"#设置数据库为INNODB,为第三方数据库登录用
                },
        }
    }

    第二部执行迁移
    1、(在project)在当前目录下执行python manage.py migrate
    全是ok则执行成功
    2、相当于执行sql语句,创建数据表(表明加上了项目)

    mysql> desc firstapp_grades;
    +----------+-------------+------+-----+---------+----------------+
    | Field    | Type        | Null | Key | Default | Extra          |
    +----------+-------------+------+-----+---------+----------------+
    | id       | int         | NO   | PRI | NULL    | auto_increment |
    | gname    | varchar(20) | NO   |     | NULL    |                |
    | gdate    | datetime(6) | NO   |     | NULL    |                |
    | gnum     | int         | NO   |     | NULL    |                |
    | isDelete | tinyint(1)  | NO   |     | NULL    |                |
    +----------+-------------+------+-----+---------+----------------+
    5 rows in set (0.06 sec)
    
    mysql> desc firstapp_students;
    +-----------+-------------+------+-----+---------+----------------+
    | Field     | Type        | Null | Key | Default | Extra          |
    +-----------+-------------+------+-----+---------+----------------+
    | id        | int         | NO   | PRI | NULL    | auto_increment |
    | sname     | varchar(20) | NO   |     | NULL    |                |
    | sgender   | tinyint(1)  | NO   |     | NULL    |                |
    | sage      | int         | NO   |     | NULL    |                |
    | scontend  | varchar(20) | NO   |     | NULL    |                |
    | isDelete  | tinyint(1)  | NO   |     | NULL    |                |
    | sgrade_id | int         | NO   | MUL | NULL    |                |
    +-----------+-------------+------+-----+---------+----------------+
    7 rows in set (0.01 sec)

    8、测试数据操作

    1、进入到python shell 环境,执行python manage.py shell

    D:programpython3Django_learningproject>python manage.py shell
    Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>>

    2、引入包

    from firstapp.models import Grades,Students
    
    from django.utils import timezone#django下面的一个工具包
    
    from datetime import*

    3、查询所有数据
    查询班级表里有多少班级

    #格式:类名.objects.all()
    Grades.objects.all()#可以查到mysql班级表里所有的数据

    Grades.objects.all()
    <QuerySet []>#为空,没有数据

    4、添加数据本质:创建一个模型类的对象实例

    1、创建对象

    grade1=Grades()#班级1,创建了一个空的
    grade1.gname = "python04"
    grade1.gdate = datetime(year=2017,month=7,day=17)
    grade1.gnum=3

    在数据库中select * from firstapp_grades;发现Empty set (0.00 sec)为空

    在上面个的代码最后添加一个grade1.save(),就会把数据存在firstapp_grades中。对象调用save,就会存在数据库里面,是模型在和数据库交互,如下代码

    注意:grade1(对象)里面除了最后的一个是否为空都必须定义数据否则会报错。

    grade1=Grades()#班级1,创建了一个空的
    grade1.gname = "python04"
    grade1.gdate = datetime(year=2017,month=7,day=17)
    grade1.gnum=3
    grade1.save()
    
    grade2=Grades()#班级2,创建了一个空的
    grade1.gname = "python10"
    grade1.gdate = datetime(year=2017,month=7,day=17)
    grade1.gnum=6

    2、去数据库中检查,数据插入成功

    mysql> select * from firstapp_grades;
    +----+----------+----------------------------+------+----------+
    | id | gname    | gdate                      | gnum | isDelete |
    +----+----------+----------------------------+------+----------+
    |  1 | python04 | 2017-07-17 00:00:00.000000 |    3 |        0 |
    |  2 | python10 | 2017-07-17 00:00:00.000000 |    6 |        0 |
    +----+----------+----------------------------+------+----------+
    1 row in set (0.00 sec)

    Grades.objects.all()
    <QuerySet [<Grades: Grades object (1)>]> #有了一条数据

    5、查看某个对象
    格式:>>>类名.objects.get(pk=2) #pk = primary key

    Grades.objects.get(pk=2)

    6、修改数据
    通过模型修改数据库里面的数据
    格式:>>>模型对象.属性=新值

    grade2.gnum=60
    grade2.save()#必须用这个要不然数据存不进去

    7、删除数据
    格式:>>>模型对象.delete()

    grade2.delete()#grade2删除,物理删除,数据库中表里的数据被删除

    8、关联对象, 外键
    1、

    grade1 = Grades.objects.get(pk=1)#主键
    stu = Students()
    stu.sname = "薛艳梅"
    stu.sgender = False
    stu.sage = 20
    stu.scontend = "我叫薛艳梅"
    stu.sgrade = grade1#外键
    stu.save()
    
    stu1=Students()
    stu1.sname="刘德华"
    stu1.sage=50
    stu1.scontend="我叫刘德华"
    stu1.sgrade = grade1#外键
    stu1.save()

    2、获得关联对象的集合
    需求:获得python04班级的所有学生

    格式:对象名.关联的类名小写_set.all
    grade1.students_set.all()

    3、需求:创建曾小贤,属于python04班级

    sname=u"曾小贤",需要加u

    可以不用save,直接添加到数据库中

    stu3=grade1.students_set.create(sname=u"曾小贤",sgender=True,scontend=u"我叫曾小贤",sage=45)

    9、启动服务器

    1、格式:
    在project目录下,该目录下有manage.py文件
    (1)输入python manage.py runserver ip:port
    (2)注意:ip可以不写,不写的话代表本机ip
    (3)端口号默认是8000,可以修改
    正常下:python manage.py runserver
    2、说明
    这是一个纯python写的轻量级web服务器,仅仅在开发测试中使用

    10、代码跑起来

    在cmd中,在project目录下,运行python manage.py runserver
    需要启动mysql
    http://127.0.0.1:8000/默认本地ip
    在浏览器输入网址http://127.0.0.1:8000/,django服务已将打开了,正常想运行django,必须打开它的服务

  • 相关阅读:
    百度病了,必应挂了,Yandex疯了。
    SpringBoot从零单排 ------ 拦截器的使用
    SpringBoot从零单排 ------初级入门篇
    我为什么放弃MySQL?最终选择了MongoDB
    NSURL组成部分详解
    关于MPMoviePlayerController 缓存播放的一些技术准备
    动画系列收藏
    代码简化
    自动循环滚动ScrollView
    iOS WKWebView 使用笔记
  • 原文地址:https://www.cnblogs.com/llb123/p/13398720.html
Copyright © 2020-2023  润新知