MTV框架之Model(数据模型)

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

1、连接MySQL数据库

项目中的settings.py设置范例

  1. # 配置数据库
  2. DATABASES = {
  3. 'default': {
  4. # 数据库引擎
  5. 'ENGINE': 'django.db.backends.mysql',
  6. # 数据库名称
  7. 'NAME': 'axf',
  8. # 账号和密码
  9. 'USER': 'root',
  10. 'PASSWORD': '123456',
  11. # IP和端口
  12. 'HOST': 'localhost',
  13. 'PORT': '3306'
  14. }
  15. }

项目中的init.py导入pymysql

  1. import pymysql
  2. 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

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

      1. class Field(RegisterLookupMixin):
      2. def __init__(self, verbose_name=None, name=None, primary_key=False,
      3. max_length=None, unique=False, blank=False, null=False,
      4. editable=True,
      5. serialize=True, unique_for_date=None, unique_for_month=None,
      6. unique_for_year=None, choices=None, help_text='',
      7. db_column=None,
      8. db_tablespace=None, auto_created=False, validators=(),
      9. error_messages=None):

  • 元信息

    • class Meta:

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

    1. # 用户数据模型
    2. class UserModel(models.Model):
    3. # 用户名密码邮箱
    4. username = models.CharField(max_length=32, unique=True)
    5. password = models.CharField(max_length=256)
    6. email = models.CharField(max_length=64, unique=True)
    7. # False 代表女
    8. sex = models.BooleanField(default=False)
    9. # 头像,图片字段,上传到静态资源文件夹下的icons/
    10. icon = models.ImageField(upload_to='icons')
    11. # 是否被逻辑删除
    12. is_delete = models.BooleanField(default=False)
    13. class Meta:
    14. #定义表名为t_user
    15. 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对象的时候,它就不会自动生成了
  • 好处:配置默认的数据创建方式和查询方式

  • 创建类并指定管理器

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

    • class MyManager(models.Manager):

    • 定义创建实例方法

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

      1. # 默认不包含被逻辑删除的狗狗
      2. # 先调用model.Manager get_queryset
      3. def get_queryset(self):
      4. 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、继承

  • 定义父类

    • 案例:动物

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

    • 案例:狗狗

      1. # 动物子类狗狗
      2. class Dog(Animal):
      3. #已经有了a_name和a_legs
      4. #定义自己独有的字段
      5. 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. 朴素贝叶斯分类器Naive Bayes

    优点Naive Bayes classifiers tend to perform especially well in one of the following situations: When t ...

  2. 坐标下降(Coordinate descent)

    坐标下降法属于一种非梯度优化的方法,它在每步迭代中沿一个坐标的方向进行线性搜索(线性搜索是不需要求导数的),通过循环使用不同的坐标方法来达到目标函数的局部极小值.

  3. Windows10下JDK8的下载安装与环境变量的配置

    Windows10下JDK8的下载安装与环境变量的配置 下载JDK8(64位) 链接:https://pan.baidu.com/s/10ZMK7NB68kPORZsPOhivog 提取码:agsa ...

  4. 记一次uwsgi django nginx 调优

    [uwsgi] project = fortune_cat uid = ubuntu gid = ubuntu path = fortune_cat base = /home/%(uid) chdir ...

  5. javascript内置对象的innerText、innerHTML、join方法的认识

    innerText语法规范:HTMLElement.innerText = string ;//后面的赋值是一个字符串形式 innerText是一个非标准形式,不识别HTML标签 返回值会去除空格和换 ...

  6. 032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题

    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例--闰年问题 本文知识点:运算符和if-else条件语句的综合案例 ...

  7. mysql时间SQL

    生成随机时间 -- 带时分秒 select FROM_UNIXTIME(UNIX_TIMESTAMP('20100101000000')+ROUND(RAND()*(UNIX_TIMESTAMP()- ...

  8. IDEA中,已经被加到版本库的文件如何在提交的时候忽略它们

    因为某些资源共享的原因,我在本地调试的时候需要修改Java启动程序类上的一些配置,禁用掉Kafka等等.然后我就想 把这些本地调试需要修改的但是线上服务不需要修改的给忽略掉,于是加入到了.gitign ...

  9. Windows7 组策略错误:“未能打开这台计算机上的组策略对象。您可能没有合适的权限。”

    在 Windows 7 系统下,打开组策略时,出现 组策略错误 -- "未能打开这台计算机上的组策略对象.您可能没有合适的权限.".如下图所示: 解决方案: 1.进入"计 ...

  10. 用composer安装captcha_src()不成功

    1,要么就是TP的框架配置有问题建议重新下载 2,要么就是下载captcha_src的语句有问题  正确的语句  composer require topthink/think-captcha 1.* ...