zoukankan      html  css  js  c++  java
  • Django入门--模型系统(一):模型基础

    1.Django的ORM介绍

    对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
    对象关系映射就是通过面向对象的方式操纵数据库,达到不用编写SQL语句就能实现对数据库的增删改查。只需要通过python的面向对象的方式就能够清楚数据之间的关系。
    python是一个编程语言,一个软件,mysql是数据库管理系统,也是一个软件,python安装pymysql库后,通过编写SQL语句对mysql进行增删改查等操作,这需要对SQL语句非常了解。在数据库中,数据之间的关系通过表来展现。在编程语言中有一种面向对象的编程方式,对数据关系进行封装后描述事物之间的关系。
    其映射关系为:
      1). 模型类必须都写在app下的models.py文件中
      2). 模型如果需要映射到数据库,所在的app必须被安装.
      3). 一个数据表对应一个模型类; 表中的字段对应模型中的类属性; 模型的一个实例对应表中的一条数据**

    2.Django连接mysql的配置流程

    启动服务后,会生成一个db.sqlite3文件,该文件为Django数据库文件,在默认情况下Django配置了文件型的数据库,python自带了sqlite驱动。Django支持多种流行数据库,详细请看数据库参考文档
    下面以连接MySql为例

    (1).进入虚拟机,安装pymysql:pip install pymysql

    (2).创建数据库用户:

      1).--创建用户'willy',密码为'123456'

    mysql > create user 'willy'@'%' identified by '123456'
    

      2).赋予权限

    mysql > grand all on *.* to 'willy'@'%'
    

      3).权限生效

    mysql > flush privileges
    
    (3).在进入新用户,并创建数据库"crm":
     mysql -A -uwilly -p123456                         #进入新用户
     create database crm;                              #创建数据库
    
    (4).在主setting.py中找到模板设置DATABASES,并进行配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',      # 数据库引擎
            'NAME': 'crm',                             # 数据库名称
            'USER':'willy',                            # 连接数据库的用户名
            'PASSWORD':'123456',                       # 连接数据库的密码
            'HOST':'127.0.0.1',                        # mysql服务器的域名和IP地址
            'PORT':'3306',                             # mysql服务器的端口,默认为3306
        }
    }
    

    'NAME'为创建的数据库名称、'USER'和‘PASSWORD’分别为新建的新用户和密码,必须与上面设置的相同。

    (5).修改项目目录下的__init__.py (和settings.py文件在同一个目录)
    import pymysql
    pymysql.install_as_MySQLdb()
    
    (6).在主setting.py中找到TIME_ZONE,设置时区:TIME_ZONE = 'Asia/ShangHai'
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    

    3.模型创建与激活

    连接数据库后,需要创建并激活模型,基本流程如下

    (1).创建模型

    定义模型必须写在app下的model.py文件中,如在student/model.py:创建Student的模型,代表学生

    from django.db import models
    
    # Create your models here.
    
    class Student(models.Model):
        name = models.CharField(max_length=20)      # 字符串,max_length必须给
        age = models.SmallIntegerField(default=0)    # default默认值
        sex = models.SmallIntegerField(default=1)
        qq = models.CharField(max_length=20, default='')
        phone = models.CharField(max_length=20, default='')
        c_time = models.DateTimeField(verbose_name='报名时间',
                          auto_now_add=True)
        def __str__(self):
            return '%s-%s' %(self.name, self.age)
    
    总结:

      1).任何模型都是django.db.models.Model的子类
      2).类变量(属性)表示模型中的数据库字段
      3).每一个字段由一个字段类的实例表示,如字符字段用CharField表示,日期字段用 DateTimeField表示

    (2).激活模型

      1)注册APP:
    在主settings.py下的INSTALLED_APPS注册应用'student'

      2)创建迁移(在项目根目录下):
    迁移是Django对模型的更改方式,告诉Django我们做了哪些数据库更改,会在app/migrations下生成类似"0001_initial.py"的数据库迁移文件

    python manage.py makemigrations student
    


    注:若果不加"student",就会对settings中注册的所有app都进行迁移
      3)查看SQL语句
    获取迁移的SQL语句,可以看出Django的模型会自动创建'id'主键,表名的形式为:应用名_模块名小写

    python manage.py sqlmigrate student 0001
    


      4).应用迁移
    创建迁移后,在mysql中还没用建立表,需要运行migrate命令,将迁移文件中的映射数据提交数据库

    python manage.py migrate student
    


    注:如果要删除表,可以在django模型中注释模型类,然后执行应用命令,不能手动在命令行删除。

    3.数据的增删改查

    通过命令进入django shell调试工具,然后进行数据的增删改查,首先安装ipython

    (djenv) pyvip@VIP:~/DjProjects/crm$ pip install ipython           # 安装ipython
    (djenv) pyvip@VIP:~/DjProjects/crm$ python manage.py shell        # 进入shell调试工具
    In[1]:from student.models import Student                          # 导入模型,进行操作
    

    接下来进行增删改查操作

    (1).增加操作

    如增加s1、s2、s3、s4学生信息

    #  方法一:
    In [1]: s1 = Student(name="Kitty", age=18, sex=0, qq="468531576")
    In [2]: s1.save()
    
    # 方法二:
    In [3]: s2 = Student()
    In [4]: s2.name = 'Tom'
    In [5]: s2.age= 21
    In [6]: s2.save()
    
    # 方法三:
    In [7]: Student.objects.create(name='Kate', age=20, phone='13647254681')
    
    # 方法四:
    In [8]: Student.objects.get_or_create(name='Rose', age=19, sex=0, phone='18647523473')
    
    (2).查询操作
    #  方法一:查询所有记录对象,输出QuerySet对象
    In [9]: Student.objects.all()
    Out[9]: <QuerySet [<Student: Kitty-18>,<Student: Tom-21>,<Student: Kate-20>,<Student: Rose-19>]>
    
    #  方法二:过滤查询。输出QuerySet对象
    In [10]: Student.objects.filter(sex=1)
    Out[10]: <QuerySet [<Student: Tom-21>,<Student: Kate-20>]>
    
    #  方法三:查询一个记录对象,输出单个对象,如果查询的对象有多个时会报错,与id一起用
    In [11]: Student.objects.get(id=2)
    Out[11]: <QuerySet [<Student: Tom-21>]>
    In [12]: s = Student.objects.get(id=2)
    In [13]: s .c_time
    Out[13]: datetime.datetime(2019, 2, 24, 9, 10, 20, 987070, tzinfo=<UTC>)
    

    从数据库中查询出来的结果一般是一个集合,这个集合称为QuerySet,他是一个可迭代对象,可以通过for循环、正向切片的方式进行取值,可以通过list强行将QuerySet变成列表

    (3).更改操作

    如把Kate的'sex'改成'0','Tom'的年龄改成'19'

    #  修改1条
    In [14]: s = Student.objects.get(name='Kate')
    In [15]: s.sex = 0
    In [16]: s.save()
    In [17]: Student.objects.get(name='Kate').sex
    Out[17]: 0
    #  update()修改多条数据
    In [18]: Student.objects.filter(name='Tom').update(age=19)
    Out[18]: 1                                              # 返回修改的条数
    In [19]: Student.objects.get(name='Tom').age
    Out[19]: 19 
    
    (4).删除操作

    如删除学生'Rose',删除所有女生

    #  修改1条
    In [20]: s = Student.objects.get(name='Rose')
    In [21]: s.delete()
    Out[21]: (1, {'student.Student'}: 1)
    #  修改多条
    In [22]: s = Student.objects.filter(sex=0).delete 
    Out[22]: (3, {'student.Student}: 3)
    
  • 相关阅读:
    关于http协议详解
    python记录_day15 面向对象初识
    python记录_day14 内置函数二 迭代 二分法
    python记录_day13 内置函数
    python记录_day12 生成器
    python记录_day11 闭包 迭代器
    函数默认参数的初始化问题
    python记录_day10 动态传参 命名空间 作用域
    python记录_day09 初识函数
    python记录_day08
  • 原文地址:https://www.cnblogs.com/rongzhen/p/10464057.html
Copyright © 2011-2022 走看看