Django中的模型与数据库(Models and database) 对于数据库大家都不陌生,但是Models该怎么理解,官方文档中有这么一句话: A model is the single, definitive source of data about your data. It contains the essential fields and behaviors of thedata yo
Django中的模型与数据库(Models and database)
对于数据库大家都不陌生,但是Models该怎么理解,官方文档中有这么一句话:
A model is the single, definitive source of data about your data. It contains the essential fields and behaviors of thedata you’re storing. Generally, each model maps to a single database table.
下文暂且称Models为“模型”(个人叫法)
那么,模型具备以下三个特征:
每一个模型都是一个python子类。继承django.db.models.Model模型的每一个属性代表一个数据库字段除了上述之外,jango还提供了自动生成数据库访问的API为了方便理解我们举个例子下面这个例子我们建立了一个Person的模型,且有两个字段)first_name,last_name
<code><span>from</span> django.db <span>import</span> models <span><span>class</span> <span>Person</span><span>(models.Model)</span>:</span> first_name = models.CharField(max_length=<span>30</span>) last_name = models.CharField(max_length=<span>30</span>) first_name和last_name是Person模型的Field,每一个Field都是一个指定的类的属性,每一个属性映射到数据库的没一列</code>
这里我就有一个疑问,到底Field能不能称为字段?
<code>上面的Person模型将会对应一张这样的数据库表: CREATE TABLE myapp_person ( <span>"id"</span> serial NOT NULL PRIMARY KEY, <span>"first_name"</span> varchar(<span>30</span>) NOT NULL, <span>"last_name"</span> varchar(<span>30</span>) NOT NULL ); 下面我们聊聊使用,一旦你声明了一个models,你需要去告诉jango你将会去使用该models,在你的settings里把你的 应用名加到INSTALLED_APPS中 INSTALLED_APPS = ( <span>#...</span> ’myapp’, <span>#...</span> ) 当你在INSTALLED_APPS添加新应用后,需要执行manage.py migrate </code>
接下来我们再来说说Fields
<code>它是模型的重要的一部分,它定义了数据库表的字段 <span>from</span> django.db <span>import</span> models <span><span>class</span> <span>Musician</span><span>(models.Model)</span>:</span> first_name = models.CharField(max_length=<span>50</span>) last_name = models.CharField(max_length=<span>50</span>) instrument = models.CharField(max_length=<span>100</span>) <span><span>class</span> <span>Album</span><span>(models.Model)</span>:</span> artist = models.ForeignKey(Musician) name = models.CharField(max_length=<span>100</span>) release_date = models.DateField() num_stars = models.IntegerField() 模型中每一个field是一个Field类实例,jango通过Field类类型去确定一下几个点。 <span>1.</span>数据库字段的类型 <span>2.</span>使用默认的HTML部件但渲染表单的field时(e.g. <input type="“text”">,<select>)</select></code>
Field option
<code>每一个Field都有一个特定参数,例如CharField,max_length null 如果是真,jango将会存储空值null进数据库 默认为false blank 如果为真,field将会允许空格的输入, 默认为false choices 一个二位元组,如果field中使用choices 则在前端展示的HTML组件就是<select> </select></code>
举个例子
<code> YEAR_IN_SCHOOL_CHOICES = ( (’FR’, ’Freshman’), (’SO’, ’Sophomore’), (’JR’, ’Junior’), (’SR’, ’Senior’), (’GR’, ’Graduate’), ) <span>from</span> django.db <span>import</span> models <span><span>class</span> <span>Person</span><span>(models.Model)</span>:</span> SHIRT_SIZES = ( (’S’, ’Small’), (’M’, ’Medium’), (’L’, ’Large’), ) name = models.CharField(max_length=<span>60</span>) shirt_size = models.CharField(max_length=<span>1</span>,choices=SHIRT_SIZES) <span>>>> </span>p = Person(name=<span>"Fred Flintstone"</span>, shirt_size=<span>"L"</span>) <span>>>> </span>p.save() <span>>>> </span>p.shirt_size u’L’ <span>>>> </span>p.get_shirt_size_display() u’Large’</code>
save()
这个在后台执行了一个插入sql。但是并没有真正的导数据库知道用户执行了save(),save()没有返回值,但是save()支持参数
<code>Model.save ([force_insert=<span>False</span>, force_update=<span>False</span>, using=DEFAULT_DB_ALIAS, update_fields=<span>None</span> ] )</code>
当你执行save()操作,jango执行以下步鄹
1:触发pre-save事件,这个信号,任何一个函数都可以监听这个事件
2:一些有特殊的字段类型的字段做处理,例如dateField和auto_now=True这时候得到的值是jango生成的时间,这里要注意的是,数据库的时间可能跟服务器的不一样,所以这里要注意时间同步。
3:为插入准备数据,每一个字段提供一个处理后的值
4:为插入准备sql,这里我理解为拼sql
5:发给数据库执行sql
all()
<code>all_entries = Entry.objects.all() 查看所有的内容 filter(**kwargs) 我们现在看下通过过滤器(filters)获取具体的值 Entry.objects.filter(pub_date__year=<span>2006</span>) exclude(**kwargs) Entry.objects.filter( <span>... </span>headline__startswith=’What’ <span>... </span>).exclude( <span>... </span>pub_date__gte=datetime.date.today() <span>... </span>).filter( <span>... </span>pub_date__gte=datetime(<span>2005</span>, <span>1</span>, <span>30</span>) … ) 返回除去与查找条件相符的数据 get() 如果想要返回指定的一个数据 one_enty = Entry.objects.get(pk=<span>1</span>) </code>
字段查询
__id
<code>被指定的查询字段名字必须是模型field名字相对应,除非外键的情况 Entry.objects.filter(blog_id=<span>4</span>) 这时候返回并不是Entry中id=<span>4</span>的数据行,而是id对应主键算在的数据行</code>
__exact
<code>最普通的情况(默认添加) Entry.objects.get(headline__exact=<span>"Man bites dog"</span>) 翻译成sql就为 SELECT ... WHERE headline = ’Man bites dog’; Blog.objects.get(id__exact=<span>14</span>) <span># 明确的形式</span> Blog.objects.get(id=<span>14</span>) <span># __exact 默认添加</span></code>
__iexact
<code>Blog.objects.get(name__iexact=<span>"beatles blog"</span>) 结果可能是 <span>"Beatles Blog"</span>, <span>"beatles blog"</span>, <span>or</span> <span>"BeAtlES blOG"</span>. 不区分大小写</code>
__contains
<code>Entry.objects.get(headline__contains=’Lennon’) 模糊搜索,翻译成sql SELECT ... WHERE headline LIKE ’%Lennon%’;</code>
__ icontains
<code>Entry.objects.get(headline__icontains=’Lennon’) sql: SELECT ... WHERE headline ILIKE ’%Lennon%’;</code>
__in
<code>Entry.objects.filter(id__in=[<span>1</span>,<span>3</span>,<span>4</span>] sql: SELECT … WHERE id IN (<span>1</span>,<span>3</span>,<span>4</span>); 这种也可以用复合sql的形式表示 inner_qs = Blog.objects.filter(name__contains=’Cheddar’) entries = Entry.objects.filter(blog__in=inner_qs) sql: SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE ’%Cheddar%’)</code>
__gt 大于
<code>Entry.objects.filter(id__gt=<span>4</span>) sql: SELECT … WHERE id > <span>4</span> __gte 大于等于 __lt 小于 __lte 小于等于</code>
__range
<code><span>import</span> datetime start_date = datetime.date(<span>2005</span>, <span>1</span>, <span>1</span>) end_date = datetime.date(<span>2005</span>, <span>3</span>, <span>31</span>) Entry.objects.filter(pub_date__range=(start_date, end_date)) sql: SELECT ... WHERE pub_date BETWEEN ’<span>2005</span>-<span>01</span>-<span>01</span>’ <span>and</span> ’<span>2005</span>-<span>03</span>-<span>31</span>’;</code>
__year
<code>Entry.objects.filter(pub_date_year=<span>2005</span>) sql: SELECT … WHERE pub_date BETWEEN ‘<span>2005</span>-<span>01</span>-<span>01</span>’ <span>and</span> ‘<span>2005</span>-<span>12</span>-<span>31</span>’;</code>
__month
__day
__hour
__minute
<code>Entry.objects.filter(pub_date__month=<span>12</span>) sql: SELECT ... WHERE EXTRACT(’month’ FROM pub_date) = ’<span>12</span>’;</code>
__isnull
<code>Entry.objects.filter(pub_date__isnull=<span>True</span>) sql: SELECT ... WHERE pub_date IS NULL;</code>

InnoDBBufferPool通过缓存数据和索引页来减少磁盘I/O,提升数据库性能。其工作原理包括:1.数据读取:从BufferPool中读取数据;2.数据写入:修改数据后写入BufferPool并定期刷新到磁盘;3.缓存管理:使用LRU算法管理缓存页;4.预读机制:提前加载相邻数据页。通过调整BufferPool大小和使用多个实例,可以优化数据库性能。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。 MySQL以其高性能、可扩展性和跨平台支持着称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

MySQL值得学习,因为它是强大的开源数据库管理系统,适用于数据存储、管理和分析。1)MySQL是关系型数据库,使用SQL操作数据,适合结构化数据管理。2)SQL语言是与MySQL交互的关键,支持CRUD操作。3)MySQL的工作原理包括客户端/服务器架构、存储引擎和查询优化器。4)基本用法包括创建数据库和表,高级用法涉及使用JOIN连接表。5)常见错误包括语法错误和权限问题,调试技巧包括检查语法和使用EXPLAIN命令。6)性能优化涉及使用索引、优化SQL语句和定期维护数据库。

MySQL适合初学者学习数据库技能。1.安装MySQL服务器和客户端工具。2.理解基本SQL查询,如SELECT。3.掌握数据操作:创建表、插入、更新、删除数据。4.学习高级技巧:子查询和窗口函数。5.调试和优化:检查语法、使用索引、避免SELECT*,并使用LIMIT。

MySQL通过表结构和SQL查询高效管理结构化数据,并通过外键实现表间关系。1.创建表时定义数据格式和类型。2.使用外键建立表间关系。3.通过索引和查询优化提高性能。4.定期备份和监控数据库确保数据安全和性能优化。

MySQL是一个开源的关系型数据库管理系统,广泛应用于Web开发。它的关键特性包括:1.支持多种存储引擎,如InnoDB和MyISAM,适用于不同场景;2.提供主从复制功能,利于负载均衡和数据备份;3.通过查询优化和索引使用提高查询效率。

SQL用于与MySQL数据库交互,实现数据的增、删、改、查及数据库设计。1)SQL通过SELECT、INSERT、UPDATE、DELETE语句进行数据操作;2)使用CREATE、ALTER、DROP语句进行数据库设计和管理;3)复杂查询和数据分析通过SQL实现,提升业务决策效率。

MySQL的基本操作包括创建数据库、表格,及使用SQL进行数据的CRUD操作。1.创建数据库:CREATEDATABASEmy_first_db;2.创建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入数据:INSERTINTObooks(title,author,published_year)VA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

Dreamweaver Mac版
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能