Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。
本节的代码:(Django 1.6, Python 2.7 测试环境)
大家可以按照我的步骤来开始做:
1
2
3
|
django-admin.py startproject learn_models # 新建一个项目
cd learn_models # 进入到该项目的文件夹
django-admin.py startapp people # 新建一个 people 应用(app)
|
补充:新建app也可以用 python manage.py startapp people, 需要指出的是,django-admin.py 是安装Django后多出的一个命令,并不是指一个 django-admin.py 脚本在当前目录下。
那么project和app什么关系呢,一个项目一般包含多个应用,一个应用也可以用在多个项目中。
将我们新建的应用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。
1
2
3
4
5
6
7
8
9
10
|
INSTALLED_APPS = (
'django.contrib.admin' ,
'django.contrib.auth' ,
'django.contrib.contenttypes' ,
'django.contrib.sessions' ,
'django.contrib.messages' ,
'django.contrib.staticfiles' ,
'people' ,
) |
我们打开 people/models.py 文件,修改其中的代码如下:
1
2
3
4
5
|
from django.db import models
class Person(models.Model):
name = models.CharField(max_length = 30 )
age = models.IntegerField()
|
我们新建了一个Person类,继承自models.Model, 一个人有姓名和年龄。这里用到了两种Field,更多Field类型可以参考教程最后的链接。
我们来同步一下数据库
1
2
3
4
5
|
python manage.py syncdb # 进入 manage.py 所在的那个文件夹下输入这个命令
注意:Django 1.7 及以上的版本需要用以下命令 python manage.py makemigrations python manage.py migrate |
我们会看到,Django生成了一系列的表,也生成了我们新建的people_person这个表,那么如何使用这个表呢?
Django提供了丰富的API, 下面演示如何使用它。
1
2
3
4
5
6
|
$ python manage.py shell >>> from people.models import Person
>>> Person.objects.create(name = "WeizhongTu" , age = 24 )
<Person: Person object >
>>> |
我们新建了一个用户WeizhongTu 那么如何从数据库是查询到它呢?
1
2
3
|
>>> Person.objects.get(name = "WeizhongTu" )
<Person: Person object >
>>> |
我们用了一个 .objects.get() 方法查询出来符合条件的对象,但是大家注意到了没有,查询结果中显示<Person: Person object>,这里并没有显示出与WeizhongTu的相关信息,如果用户多了就无法知道查询出来的到底是谁,查询结果是否正确,我们重新修改一下 people/models.py
name 和 age 等字段中不能有 __(双下划线,因为在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)
也不能有Python中的关键字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因为它是Python的关键字( import keyword; print(keyword.kwlist) 可以打出所有的关键字)
1
2
3
4
5
6
7
8
9
10
|
from django.db import models
class Person(models.Model):
name = models.CharField(max_length = 30 )
age = models.IntegerField()
def __unicode__( self ):
# 在Python3中使用 def __str__(self)
return self .name
|
按CTRL + C退出当前的Python shell, 重复上面的操作,我们就可以看到:
新建一个对象的方法有以下几种:
-
Person.objects.create(name=name,age=age)
-
p = Person(name="WZ", age=23)
p.save()
-
p = Person(name="TWZ")
p.age = 23
p.save()
-
Person.objects.get_or_create(name="WZT", age=23)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
获取对象有以下方法:
-
Person.objects.all()
-
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
-
Person.objects.get(name=name)
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
-
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
-
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
-
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
-
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
-
Person.objects.filter(name__regex="^abc") # 正则表达式查询
-
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
-
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
-
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
参考文档:
Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/
Fields相关官方文档:https://docs.djangoproject.com/en/dev/ref/models/fields/
相关推荐
Django模型字段加密/解密您的数据,并加密保存至数据库中
配套资源
django-ldapdb, Django ldapdb,用于 Django的LDAP数据库后端 django-ldapdb django-ldapdb 是用于 Django的LDAP数据库后端,允许通过 Django 模型操作LDAP条目。它支持大多数与 Django 模型相同的api:MyModel.o
Django学习笔记(三)源码,关于django数据库应用模型的学习,使用mysql数据库。
使用 Django inspectdb 工具自动生成目标数据库的模型,理论上支持将任意数据库。 首先将 config.py.sample 复制到 config.py 并填写配置信息。 然后执行的 inspectdb 语句,得到数据表模型。 模型存储路径: server/...
本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路。效果演示在项目实战最后一节,文章结尾有整个项目的源码地址。 ...
django-dirtyfields, 在 Django 模型中,跟踪脏字段 Django 脏字段 跟踪 Django 模型实例上的脏字段。 Dirty表示内存和数据库值中的字段是不同的。这个软件包是兼容的,并用最新版本的Django ( 1.8.1.9.1.10.系列) ...
2021年秋季学习数据库课程的作业项目:基于PythonDjango模型的学生选课系统.zip
Django模型基本操作开发流程配置数据库定义模型类生成迁移文件执行迁移生成数据表使用模型类进行增删改查概述:对象——关系——印射任务:根据对象的类型生成表结构
模型实例方法 str():在将对象转换成字符串时会被调用。 save():将模型对象保存到数据表中,ORM框架会转换成对应的...管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器。Django
主要给大家介绍了关于利用信号如何监控Django模型对象字段值变化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
python 零基础学习篇
主要介绍了Django多数据库配置及逆向生成model教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
基于Django开发的智能分类图片平台源码(含客户端)+sql数据库+模型文件.zip基于Django开发的智能分类图片平台源码(含客户端)+sql数据库+模型文件.zip基于Django开发的智能分类图片平台源码(含客户端)+sql数据库+模型...
你通过以下语句,创建了一个数据库视图: create view entities_entity as select id, name from entities_hero union select 10000+id as id, name from entities_villain 它包含所有Hero和Villain对象的名称。...
这是在数据库表(django 模型)级别完成的。 核心是一个名为 Tenant 的模型,只有两个字段:姓名和电子邮件。 通过添加指向该租户模型的 ForeignKey 字段,可以使 django 项目中的任何其他模型成为“租户感知”。 ...
在本篇文章里小编给大家分享的是关于Django用数据库表反向生成models类知识点内容,需要的朋友们可以参考下。
django-ldapdb django-ldapdb是Django的LDAP数据库后端,允许通过Django模型操纵LDAP条目。 它支持与Django模型相同的大多数API: MyModel.objects.create() MyModel.objects.filter(x=1, y__contains=2) 全面的管理...
特征查询集中的模型自动具有正确的类对公共基础进行子类化的所有模型都存储在同一个表中对象类型存储在数据库的“类型”字段中没有额外的查询或连接来检索多种类型用法: 一个例子说了一堆词: # myapp/models.py...
我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。 迁移数据库 为了让 django 完成翻译,创建好这些...