目录
字段查询
__id
__exact
__iexact
__contains
__ icontains
__in
__gt 大于
__range
__year
__month
__day
__hour
__minute
__isnull
首页 数据库 mysql教程 Django中的模型与数据库(Models and database)

Django中的模型与数据库(Models and database)

Jun 07, 2016 pm 03:15 PM
and da django 数据库 模型

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>
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

替代MLP的KAN,被开源项目扩展到卷积了 替代MLP的KAN,被开源项目扩展到卷积了 Jun 01, 2024 pm 10:03 PM

本月初,来自MIT等机构的研究者提出了一种非常有潜力的MLP替代方法——KAN。KAN在准确性和可解释性方面表现优于MLP。而且它能以非常少的参数量胜过以更大参数量运行的MLP。比如,作者表示,他们用KAN以更小的网络和更高的自动化程度重现了DeepMind的结果。具体来说,DeepMind的MLP有大约300,000个参数,而KAN只有约200个参数。KAN与MLP一样具有强大的数学基础,MLP基于通用逼近定理,而KAN基于Kolmogorov-Arnold表示定理。如下图所示,KAN在边上具

无需OpenAI数据,跻身代码大模型榜单!UIUC发布StarCoder-15B-Instruct 无需OpenAI数据,跻身代码大模型榜单!UIUC发布StarCoder-15B-Instruct Jun 13, 2024 pm 01:59 PM

在软件技术的前沿,UIUC张令明组携手BigCode组织的研究者,近日公布了StarCoder2-15B-Instruct代码大模型。这一创新成果在代码生成任务取得了显着突破,成功超越CodeLlama-70B-Instruct,登上代码生成性能榜单之巅。 StarCoder2-15B-Instruct的独特之处在于其纯自对齐策略,整个训练流程公开透明,且完全自主可控。该模型通过StarCoder2-15B生成了数千个指令,响应对StarCoder-15B基座模型进行微调,无需依赖昂贵的人工标注数

全面超越DPO:陈丹琦团队提出简单偏好优化SimPO,还炼出最强8B开源模型 全面超越DPO:陈丹琦团队提出简单偏好优化SimPO,还炼出最强8B开源模型 Jun 01, 2024 pm 04:41 PM

为了将大型语言模型(LLM)与人类的价值和意图对齐,学习人类反馈至关重要,这能确保它们是有用的、诚实的和无害的。在对齐LLM方面,一种有效的方法是根据人类反馈的强化学习(RLHF)。尽管RLHF方法的结果很出色,但其中涉及到了一些优化难题。其中涉及到训练一个奖励模型,然后优化一个策略模型来最大化该奖励。近段时间已有一些研究者探索了更简单的离线算法,其中之一便是直接偏好优化(DPO)。DPO是通过参数化RLHF中的奖励函数来直接根据偏好数据学习策略模型,这样就无需显示式的奖励模型了。该方法简单稳定

Yolov10:详解、部署、应用一站式齐全! Yolov10:详解、部署、应用一站式齐全! Jun 07, 2024 pm 12:05 PM

一、前言在过去的几年里,YOLOs由于其在计算成本和检测性能之间的有效平衡,已成为实时目标检测领域的主导范式。研究人员探索了YOLO的架构设计、优化目标、数据扩充策略等,取得了显着进展。同时,依赖非极大值抑制(NMS)进行后处理阻碍了YOLO的端到端部署,并对推理延迟产生不利影响。在YOLOs中,各种组件的设计缺乏全面彻底的检查,导致显着的计算冗余,限制了模型的能力。它提供了次优的效率,以及相对大的性能改进潜力。在这项工作中,目标是从后处理和模型架构两个方面进一步提高YOLO的性能效率边界。为此

LLM全搞定!OmniDrive:集3D感知、推理规划于一体(英伟达最新) LLM全搞定!OmniDrive:集3D感知、推理规划于一体(英伟达最新) May 09, 2024 pm 04:55 PM

写在前面&笔者的个人理解这篇论文致力于解决当前多模态大语言模型(MLLMs)在自动驾驶应用中存在的关键挑战,即将MLLMs从2D理解扩展到3D空间的问题。由于自动驾驶车辆(AVs)需要针对3D环境做出准确的决策,这一扩展显得尤为重要。3D空间理解对于AV来说至关重要,因为它直接影响车辆做出明智决策、预测未来状态以及与环境安全互动的能力。当前的多模态大语言模型(如LLaVA-1.5)通常仅能处理较低分辨率的图像输入(例如),这是由于视觉编码器的分辨率限制,LLM序列长度的限制。然而,自动驾驶应用需

清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜 清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜 Jun 06, 2024 pm 12:20 PM

目标检测系统的标杆YOLO系列,再次获得了重磅升级。自今年2月YOLOv9发布之后,YOLO(YouOnlyLookOnce)系列的接力棒传到了清华大学研究人员的手上。上周末,YOLOv10推出的消息引发了AI界的关注。它被认为是计算机视觉领域的突破性框架,以实时的端到端目标检测能力而闻名,通过提供结合效率和准确性的强大解决方案,延续了YOLO系列的传统。论文地址:https://arxiv.org/pdf/2405.14458项目地址:https://github.com/THU-MIG/yo

李飞飞揭秘创业方向'空间智能”:视觉化为洞察,看见成为理解,理解导致行动 李飞飞揭秘创业方向'空间智能”:视觉化为洞察,看见成为理解,理解导致行动 Jun 01, 2024 pm 02:55 PM

斯坦福李飞飞创业后,首次揭秘新概念“空间智能”。这不仅是她的创业方向,也是指引她的“北极星”,被她认为是“解决人工智能难题的关键拼图”。视觉化为洞察;看见成为理解;理解导致行动。在李飞飞15分钟TED演讲完整公开的基础上,从数亿年前生命进化的起源开始,到人类如何不满足于自然赋予而发展人工智能,直到下一步如何构建空间智能。9年前,李飞飞在同一个舞台上,向世界介绍了刚诞生不久的ImageNet——这一轮深度学习爆发的起点之一。她本人也向网友自我安利:如果把两个视频都看了,你就能对过去10年的计算机视

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

See all articles