MTV框架之Model(数据模型)

关注公众号“轻松学编程”了解更多。

1、连接MySQL数据库

项目中的settings.py设置范例

# 配置数据库
DATABASES = {
'default': {
# 数据库引擎
'ENGINE': 'django.db.backends.mysql', # 数据库名称
'NAME': 'axf', # 账号和密码
'USER': 'root',
'PASSWORD': '123456', # IP和端口
'HOST': 'localhost',
'PORT': '3306'
}
}

项目中的init.py导入pymysql

import pymysql
pymysql.install_as_MySQLdb()

2、ORM

  • ObjectRelationalMapping=对象关系映射
  • 将具体语言下的【数据及其结构(通常以类表示)】映射为数据库的【表结构和数据】
  • 在Django中,一旦数据结构发生变化,就需要重新进行数据迁移

3、数据迁移操作

方法一:在Terminal窗口输入:

  • python manage.py makemigrations 生成数据迁移py文件
  • python manage.py migrate 执行数据迁移

方法二、在工具栏Tools->Run manage.py Task…窗口输入:

  • makemigrations 生成数据迁移py文件
  • migrate 执行数据迁移

4、数据定义

  • 数据类型

    • 整型:models.IntegerField(default=1)
    • 浮点型:models.FloatField(default=0)
    • 字符串: models.CharField(max_length=32, unique=True)
    • 长文本:models.TextField(db_column=‘ps’)
      • 大文本字段,一般超过4000使用
    • 布尔型:models.BooleanField(default=False)
    • 带空值布尔型:NullBooleanField
      • 支持null、true、false三种值
    • 日期时间:models.DateTimeField(auto_now=True)
      • 使用Python的datetime.datetime实例表示的日期和时间
      • 若auto_now=True,每次保存对象时,自动设置该字段为当前时间
      • 若auto_now_add=True,当对象第一次被创建时自动设置当前时间(一次性的时间戳)
      • 注意:auto_now_add, auto_now,default三者是互斥的
    • 其它字段类型
      • 带小数点:DecimalField(max_digits=None, decimal_places=None)

        • 使用python的Decimal实例表示的十进制浮点数
        • max_digits=总位数
        • decimal_places=小数位数
      • 日期:DateField([auto_now=False, auto_now_add=False])
        • 使用Python的datetime.date实例表示的日期
      • 时间:TimeField
        • 使用Python的datetime.time实例表示的时间
      • 主键:a_id = models.AutoField(primary_key=True)
        • 一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
      • 文件:FileField
        • 上传文件字段
      • 图像:icon = models.ImageField(upload_to=‘icons’)
        • 继承于FileField,框架对上传的对象进行校验,确保它是个有效的image
    • 表关系字段(外键)
  • 字段约束

    • primary_key=False

      • django会为表增加自动增长的主键列
      • 如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
    • max_length=None

    • unique=False

    • null=False

      • 如果为True,则默认以空值NULL填充
    • blank=False

      • 如果为True,则该字段允许为空白(即空字符串),这个约束常常用于表单验证
    • default=NOT_PROVIDED

    • db_index=False

      • 若值为 True, 则在表中会为此字段创建索引
    • db_column=None

      • 字段的名称,如果未指定,则使用属性的名称
    • 完整约束源码

      class Field(RegisterLookupMixin):
      
          def __init__(self, verbose_name=None, name=None, primary_key=False,
      max_length=None, unique=False, blank=False, null=False,
      editable=True,
      serialize=True, unique_for_date=None, unique_for_month=None,
      unique_for_year=None, choices=None, help_text='',
      db_column=None,
      db_tablespace=None, auto_created=False, validators=(),
      error_messages=None):

  • 元信息

    • class Meta:

      • db_table = ‘Flower’ #放在模型中,自定义生成的表名
      • ordering = ["-f_color"] #放在模型中,对表进行默认排序
        • 这是一个 tuple 或一个字符串列表. 每个字符串是一个字段名带及一个可选的前缀 “-” , 这个前缀表示按降序排序(递减). 若没有这个前缀,则表示按升序排序.字符串 “?” 表示随机排序.
  • 范例:用户定义

    # 用户数据模型
    class UserModel(models.Model): # 用户名密码邮箱
    username = models.CharField(max_length=32, unique=True)
    password = models.CharField(max_length=256)
    email = models.CharField(max_length=64, unique=True) # False 代表女
    sex = models.BooleanField(default=False) # 头像,图片字段,上传到静态资源文件夹下的icons/
    icon = models.ImageField(upload_to='icons') # 是否被逻辑删除
    is_delete = models.BooleanField(default=False) class Meta:
    #定义表名为t_user
    db_table = "t_user"

5、数据查询

  • 查询语法

    • XXX.objects.all()
    • XXX.objects.get(k1=v1,k2=v2)
    • 过滤器
      • XXX.objects.filter(条件语句)
      • XXX.objects.exclude(条件语句)
  • 过滤器
    • filter(条件语句):获取符合条件的
    • exclude(条件语句):去除不符合条件的
  • 条件语句
    • 格式

      • 格式1:属性名=值(忽略大小写)
      • 格式2:属性名__运算符=临界值
    • 运算符
      • gt
      • lt
      • gte
      • lte
      • startswith
        • 大小写敏感
      • endswith
      • contains
      • exact
      • istartswith
        • i=忽略大小写
      • iendswith
      • icontains
      • iexact
  • 缓存的二次筛选
    • 查询时允许多个过滤器串联使用(链式调用)
    • 只有第一次会执行数据库查询,后续操作是对已有结果集的筛选
  • Q对象:实现复杂条件
    • Q(条件语句) & Q(条件语句)

      • 条件与
    • Q(条件语句) | Q(条件语句)
      • 条件或
    • ~ Q(条件语句)
      • 条件非

6、表关系

  • 一对一(OneToOneField)

    • 将关系字段定义在任意一方

      • Person-IDCard
        一张身份证对应着一个人
      • 从表IDCard持有外键
    • 一访问一
      • 格式:对象.模型类小写
      • idcard = person.idcard
  • 一对多(ForeignKey)
    • 将关系字段定义在多方

      • Person-Hobby
      • 多方Hobby持有外键
    • 一访问多
      • 格式:对象.模型类小写_set
      • hobbies = person.hobby_set
  • 多对多(ManyToManyField)
    • 将关系字段定义在任意一方

      • Buyer-Goods
      • 从表Goods声明关联关系
    • 多a访问多b
      • goods.g_buyers.add(buyer)
      • buyers = goods.g_buyers.all()
      • goods_list = buyer.goods_set.all()
  • on_delete
    • 定义删除对象时如何处理其级联数据(其外键/关系字段指向的数据)
    • 可选值
      • models.CASCADE

        • 默认值,默认删除级联数据
      • models.PROTECT
        • 不存在级联数据的时候允许删除
        • 当存在级联数据的时候删除会抛出保护异常
      • models.SET_NULL
        • 级联数据赋值为空
      • models.SET_DEFAULT
        • 前提是字段本身有默认值
      • models.SET()
        • 删除的时候重新动态指向一个实体
  • 维护表关系思路
    • 在从表中添加关系字段,其类型即为【对方对象(或对象容器)】
    • 框架自动为主表添加对应的关系字段,其类型即为【对方对象(或对象容器)】
      • .对方类名,IDE会自动提示可用的属性

7、Manager

  • 显式属性/隐式属性

    • 显式属性

      • 开发者手动定义的,直接看的到的
    • 隐式属性
      • 系统/框架根据需求,自动创建的对象
      • objects是model.Manager对象
      • 当我们手动创建了Manager对象的时候,它就不会自动生成了
  • 好处:配置默认的数据创建方式和查询方式

  • 创建类并指定管理器

    class Dog(models.Model):
    d_name = models.CharField(max_length=16)
    d_legs = models.IntegerField(default=4)
    is_delete = models.BooleanField(default=False) # 交由管理器进行管理
    d_manager = MyManager()
  • 定义管理器类

    • class MyManager(models.Manager):

    • 定义创建实例方法

          # 创建狗的实例,默认两条腿
      def create_model(self,d_name, d_legs = 2):
      dog = self.model()
      dog.d_name = d_name
      dog.d_legs = d_legs
      return dog
    • 定义查询方法

       # 默认不包含被逻辑删除的狗狗
      # 先调用model.Manager get_queryset
      def get_queryset(self):
      return super(MyManager,self).get_queryset().exclude(is_delete=True)

  • 使用管理器类

    • 创建实例

      • dog = Dog.d_manager.create_model(“中国田园犬”)
    • 查询实例
      • dogs = Dog.d_manager.all()
      • dogs = Dog.d_manager.all().filter(is_delete=False)
      • dogs = Dog.d_manager.filter(d_legs__lt=100)
      • dogs = Dog.d_manager.filter(Q(d_legs__lt=20)|Q(d_legs__gt=150))

8、继承

  • 定义父类

    • 案例:动物

      # 动物父类
      class Animal(models.Model): #名字和腿数
      a_name = models.CharField(max_length=16, default='Animal')
      a_legs = models.IntegerField(default=4) class Meta: #表名是抽象的,框架不会为当前类创建表
      abstract = True
  • 定义子类

    • 案例:狗狗

      # 动物子类狗狗
      class Dog(Animal):
      #已经有了a_name和a_legs #定义自己独有的字段
      d_fun = models.TextField()

9、常用API

  • 查询

    • flowers = Flower.objects.all()

      flowers = Flower.objects.all().order_by("-id")[0:2]

      flowers = Flower.objects.filter(f_color__gt=100).filter(f_color__lt=150)

      flowers = Flower.objects.filter(f_color__gt=100).exclude(f_color__gt=150).filter(f_name__contains=“水”)

      flowers = Flower.objects.filter(f_name__endswith=“1”)

      flowers = Flower.objects.filter(f_name=“rose”)

      flowers = Flower.objects.filter(pk__in=[1,2,3,4])

      flowers = Flower.objects.filter(f_time__year=“2019”)

      students = Student.objects.filter(s_grade_id__gt=F(‘id’)-5)

      ----------

      flower = Flower.objects.get(pk=10)

      flower = Flower.objects.get(f_color=255)

      ----------

      flower = flowers.last()

      flower = flowers.first()

      if flowers.count() == 0:

      if flowers.exists():

      ----------

      dogs = Dog.objects.filter(~Q(d_legs__lt=100))

  • 插入

    • grade = Grade()
    • grade.g_name = ‘fuck’
    • grade.save()
    • ----------
    • person = Person.objects.create(p_name=“小黄%d”%random.randrange(110))
    • p = Buyer.objects.create(b_name=“清醒%d下” % flag)
    • goods = Goods.objects.create(g_name=“娃娃%d” % flag, g_price=flag)
  • 删除

    • 通过查询得到一个特定的grade对象
    • grade.delete()
  • 修改

    • 通过查询得到一个特定的grade对象
    • grade.gname=‘shit’
    • grade.save()

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python框架Django中MTV之Model(数据模型)的更多相关文章

  1. python框架Django中MTV框架之VIew(业务控制器)

    MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...

  2. python框架Django中MTV框架之Template(模板/界面)

    MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...

  3. python框架django中结合vue进行前后端分离

    一:创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应 ...

  4. python框架Django中的MTV架构

    MTV架构 关注公众号"轻松学编程"了解更多. ​ 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...

  5. 编程 - Python - 框架 - Django

    一.Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了. 1. web框架介绍 具体介绍Django之前,必须先介绍W ...

  6. python框架Django简介与安装

    Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...

  7. Python—在Django中使用Celery

    一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...

  8. 067.Python框架Django之DRF视图类

    一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...

  9. 在python的web框架Django中使用SQL Server

    在pycharm中安装 安装pyodbc和Django——pyodbc是一个用python写的ODBC引擎 安装Django-pyodbc-azure                  在后方网址中查 ...

随机推荐

  1. Centos-系统任务队列信息-uptime

    uptime 显示系统的当前时间.系统从启动到当前运行时间.当前总共在线用户.系统1.5.15分钟负载情况

  2. 图像分辨率 像素 大小 LCD显示 为OLED屏增加GUI支持

    1. 根据一张标准图片的分辨率,结合每个像素的大小,可以计算得到这张图片的大小(字节数) 补充点:bmp格式的图片有24色或者32色.(其一个像素点可能占用24bits或者32bits)  至于图片怎 ...

  3. 001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学

    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学 welcome to Java World 欢迎来到Java世界 一起领略Java编程世界的奥秘与奥妙 ...

  4. JDBC Java 程序从 MySQL 数据库中读取数据,并封装到 Javabean 对象中

    MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 连接 MySQL 数据库 用于测试的 M ...

  5. Web前后端:如何分离,如何解耦?

    摘要:在本文中我们一起来探讨一下为什么要在软件开发中进行前后端的分离,如何做到前后端分离,如何解耦. 简单地说,就是要把复杂的问题简单化,把一个从0到N的问题转化为N个0到1的问题.另一个相近的说法就 ...

  6. spring-boot-route(十四)整合Kafka

    在上一章中SpringBoot整合RabbitMQ,已经详细介绍了消息队列的作用,这一种我们直接来学习SpringBoot如何整合kafka发送消息. kafka简介 kafka是用Scala和Jav ...

  7. shell-变量的数值运算-bc-typeset-中括号等方法介绍

    1. bc命令的用法: bc是unix下的计算器,它也可以用在命令行下面:    例:给自变量i加1 i=2 i=`echo $i + 1|bc` --------效率低     因为bc支持科学计算 ...

  8. 9.Android-读写SD卡案例

    1.效果如下所示: 2.读写SD卡时,需要给APP添加读写外部存储设备权限,修改AndroidManifest.xml,添加: <uses-permission android:name=&qu ...

  9. 解决SpringBoot 定时计划 quartz job 任务重复执行多次(10次)

    上一篇:SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源 设置了多个 任务,本应该是各司其职的,任务调用多线程处理任务,but这个定时任务竟然同时跑了10次???如 ...

  10. 2016年 实验五 Internet与网络工具的使用

    实验五 Internet与网络工具的使用 [实验目的] 本实验目的在于掌握 Telnet.FTP.Email的工作机理,并会在 Internet 上熟练使用相关工具软件. [实验条件] ⑴.个人计算机 ...