Django中ORM基本应用与原理解析

 更新时间:2022年10月13日 10:41:19   作者:世界尽头与你  
Django的ORM模块是框架特色功能之一,它把数据表与Python类对应、表字段与类属性对应、类实例与数据记录对应,并将对类实例的操作映射到数据库中,这篇文章主要介绍了Django ORM基本应用与原理剖析,需要的朋友可以参考下

1.ORM构建数据表

由于每一个数据表对应一个Model定义,每一个Model都是一个Python类,所以,Model之间是可以继承的。Django规定,所有的Model都必须继承自django.db.models.Model

Model中的所有字段都是django.db.models.Field的子类,Django会根据Field的类型确定数据库表的字段类型

首先定义定义抽象Model基类:

class BaseModel(models.Model):
    class Meta:
        # 抽象类,表现为BaseModel不会创建数据表
        abstract = True
        # 按照创建时间逆序排序
        ordering = ['-created_time']

    # 定义了两个类属性:created_time和last_modified,且都是DateTimeField类型
    # auto_now_add用于将首次创建对象时间设置为当前时间
    # auto_now用于将每次保存对象时间设置为当前时间
    created_time = models.DateTimeField(auto_now_add=True, help_text=u'创建时间')
    last_modified = models.DateTimeField(auto_now=True, help_text=u'修改时间')

    # 优化打印(print)Model实例的样式
    def __str__(self):
        raise NotImplementedError

由于BaseModel直接继承自django.db.models.Model,所以,我们创建的实体数据表可以继承自Base Model,从而实现间接继承

例如:话题表

class Topic(BaseModel):
    title = models.CharField(max_length=255, unique=True, help_text=u'话题标题')
    content = models.TextField(help_text=u'话题内容')
    is_online = models.BooleanField(default=True, help_text=u'话题是否在线')
    user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'关联用户表')

    def __str__(self):
        return '%d:%s' % (self.id, self.title[0:20])

Topic中除了基本类型的字段定义之外,还包含了一个外键(ForeignKey)引用的user字段

评论表:

class Comment(BaseModel):
    content = models.CharField(max_length=255, help_text=u'话题评论')
    topic = models.ForeignKey(to=Topic, to_field='id', on_delete=models.CASCADE, help_text=u'关联话题表')
    up = models.IntegerField(default=0, help_text=u'支持')
    down = models.IntegerField(default=0, help_text=u'反对')

    def __str__(self):
        return '%d:%s' % (self.id, self.content[0:20])

2.数据迁移

首先,在settings.py文件中添加此Model视图的app:(post.apps.PostConfig

INSTALLED_APPS = [
    'post.apps.PostConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

生成迁移文件:

python manage.py makemigrations post

执行migrate命令将Models映射为数据库的表:

python manage.py migrate

生成的表结构:

3.Model相关的概念与使用方法

Model的组成部分

每个Model都是一个Python类,且通常会包含四个部分:继承自django.db.models.Model、Model元数据声明(Meta内部类)、若干个Field类型的字段以及__str__方法

Meta元数据类属性说明

Meta类用于定义Model的元数据,即不属于Model的字段,但是可以用来标识它的一些属性

abstract:

一个布尔类型的变量,如果设置为True,则标识当前的Model是抽象基类,这个元选项不具有传递性,只对当前声明的类有效。例如,对于之前定义的BaseModel,用abstract声明为抽象基类,但是子类Topic和Comment不受影响

db_table:

这个字段用于指定数据表的名称

默认会使用Django的表名生成规则,例如Topic会映射到post_topic表。如果想让Topic映射到topic表,定义db_table='topic'即可

ordering:

用于指定获取对象列表时的排序规则

按照created_time逆序排序,可以定义:

ordering = ['-created_time']

先按照created_time逆序排序,再按照last_modified正序排序:

ordering = ['-created_time', 'last_modified']

indexes:

它是一个列表类型的元选项,用来定义Model的索引

  • fields:一个列表对象,用于指定索引的字段,是必填项,且至少包含一个字段。
  • name:用于标识索引的名称,是可选的,如果不提供,Django会根据不同的数据库生成合适的索引名。
  • db_tablespace:表空间,也是可选的,常见于PostgreSQL、Oracle数据库,用于优化数据库性能

unique_together:

标识联合唯一约束,在数据库层面表现为联合唯一索引

Field的通用字段选项

blank:

对于任何一个属性,默认是不允许输入空值的,如果允许这种情况发生,需要设置blank=True

unique:

如果一个字段设置了unique=True,则表示唯一性索引

null:

规定这个字段的数据是否可以是空值

db_index:

如果该字段经常作为查询的条件,那么就需要考虑设置db_index选项,以加快数据的检索速度

default:

用于给字段设置默认值

choices:

设置了choices的字段在管理后台的显示上会由文本框变成选择框,选择框中的可选值就是choices中的元组

help_text:

这个选项用于在表单中显示字段的提示信息。例如在管理后台的编辑页面,对应在字段输入框的下方会显示该选项设定的值

基础字段类型

  • IntegerField:整型字段
  • Django还提供了SmallIntegerField(小整数)、BigIntegerField(64位整数)和PositiveIntegerField(只允许存储大于等于0的整数)等字段类型用来满足存储整数的不同业务场景
  • AutoField:一个根据ID自增的IntegerField
  • 如果觉得AutoField的取值范围不够用,可以考虑使用BigAutoField
  • CharField:字符字段
  • TextField:也是用于存储字符类型的字段,但是它用于存储大文本
  • BooleanField:布尔类型
  • DateField和DateTimeField:标识时间的
  • 它们都有两个特殊的参数选项可以设置
  • ①auto_now:这个选项应用在对象保存的时候,会自动设置为当前时间
  • ②auto_now_add:当首次创建对象的时候,会自动将字段设置为当前时间
  • EmailField:专门用来存储电子邮件地址的
  • 除了之前介绍的几种常见的类型之外,还有GenericIPAddressField用于存储IP地址、URLField用于存储URL、FloatField用于存储浮点数的字段类型等

关系字段类型

多对一

实例:

user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'关联用户表')

to:指定所关联的Model

on_delete:当删除关联表的数据时,Django将根据这个参数设定的值确定应该执行什么样的SQL约束

  • CASCADE:级联删除,它是大部分ForeignKey的定义应该选择的约束。它的表现是删除了“一”,则“多”会被自动删除
  • PROTECT:删除被引用对象时,将会抛出ProtectedError异常
  • SET_NULL:设置删除对象所关联的外键字段为null。以Topic和Comment的关系举例:删除了Topic,与之相关联的Comment的topic字段会被设置为null
  • SET_DEFAULT:将外键字段设置为默认值
  • SET(value):删除被引用对象时,设置外键字段为value
  • DO_NOTHING:不做任何处理

一对一

实例:

user = models.OneToOneField(to=User, on_delete=models.CASCADE, parent_link=False,
                             help_text=u'关联用户表')

多对多关系类型

实例:

books = models.ManyToManyField(to=Book)

到此这篇关于Django ORM基本应用与原理剖析的文章就介绍到这了,更多相关Django ORM原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python数据类型-序列sequence

    Python数据类型-序列sequence

    这篇文章主要介绍了Python数据类型-序列sequence,在前面,我们已经对Python学习做了系统的知识梳理(Python思维导图),我们接下来把知识点分节进行细讲。这一节,我们讲解序列,需要的朋友可以参考下
    2022-01-01
  • python中如何读取xlsx文件

    python中如何读取xlsx文件

    这篇文章主要介绍了python中如何读取xlsx文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python 操作SQLite数据库详情

    Python 操作SQLite数据库详情

    这篇文章主要介绍了Python 操作SQLite数据库,SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中,下面来看看详细内容,需要的朋友可以参考一下
    2021-11-11
  • python技能之数据导出excel的实例代码

    python技能之数据导出excel的实例代码

    本篇文章主要介绍了python技能之导出excel的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • python 3.6.7实现端口扫描器

    python 3.6.7实现端口扫描器

    这篇文章主要为大家详细介绍了python 3.6.7实现端口扫描器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • python绘制饼图和直方图的方法

    python绘制饼图和直方图的方法

    这篇文章主要为大家详细介绍了python绘制饼图和直方图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Pycharm2020.1安装无法启动问题即设置中文插件的方法

    Pycharm2020.1安装无法启动问题即设置中文插件的方法

    这篇文章主要介绍了Pycharm2020.1安装无法启动问题即设置中文插件的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-08-08
  • 关于pytorch中全连接神经网络搭建两种模式详解

    关于pytorch中全连接神经网络搭建两种模式详解

    今天小编就为大家分享一篇关于pytorch中全连接神经网络搭建两种模式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 基于Python实现视频的人脸融合功能

    基于Python实现视频的人脸融合功能

    这篇文章主要介绍了用Python快速实现视频的人脸融合功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Python实现PC屏幕截图并自动发送邮件

    Python实现PC屏幕截图并自动发送邮件

    在当前的数字化世界中,自动化已经成为我们日常生活和工作中的关键部分,本文我们将探讨如何使用Python来实现一个特定的自动化任务 - PC屏幕截图自动发送到指定的邮箱,感兴趣的可以了解下
    2023-11-11

最新评论