Django 模型(model)与数据库
Django 模型(model)与数据库
初步使用模型
Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 Sqlite3、MySQL、PostgreSQL 等数据库,只需要在 settings.py 中配置即可,不用更改 models.py 中的代码,丰富的 API 极大的方便了使用。
我们继续沿用之前创建的 learn 这个 app 进行实验。修改 learn 中的 models.py 如下所示:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
这段代码中,我们新建了一个 Person 类,继承自 models.Model,一个人有年龄和姓名。这里用到了两种 Field,更多的可以查看本教程最后的链接处。
然后来执行同步数据库操作(我们使用默认的 sqlite3数据库,无需任何其他配置):
$ python3 manage.py makemigrations
$ python3 manage.py migrate

从反馈的 log 中可以看到,Django 生成了我们新建的 Person 这个表。Django 还为我们提供了丰富的 API,下面演示如何来使用它:
$ python3 manage.py shell
>>> from learn.models import Person
>>> Person.objects.create(name="Gua", age=22)
<Person: Person object>
我们新建了一个用户 Gua,那么如何从数据库中查询到它呢?
>>> Person.objects.get(name="Gua")
<Person: Person object>
我们用了一个 .objects.get() 方法查询出来符合条件的对象,但是查询结果中显示
备注:name 和 age 等字段中不能有 __(双下划线,因为在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)。也不能有Python中的关键字,name 是合法的,studentname 也合法,但是student_name不合法,try, class, continue 也不合法,因为它是Python的关键字( import keyword; print(keyword.kwlist) 可以打出所有的关键字)。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name

数据库增与取操作的多种方法
增操作
新建一个对象的写法有以下几种:
# 1
Person.objects.create(name = name, age = age)
# 2
p = Person(name = name, age = age)
p.save()
# 3
p = Person(name = name)
p.age = age
p.save()
# 4
Person.objects.get_or_create(name = name, age = age)
第四种方法是防止重复的很好方法,但是速度相对较慢,返回一个元祖,第一个为 Person 对象,第二个为 True 或 False 布尔量。新建时返回的是 True,已经存在时返回 False。
查操作
查找一个对象有更多的方式:
# 1
Person.objects.all()
# 2. 切片操作,获取10个人,不支持负索引,切片可以节约内存
Person.objects.all()[:10]
# 3
Person.objects.get(name = name)
# 4. get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到 filter
Person.objects.filter(name = "abc")
# 5. 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__iexact = "abc")
# 6. 名称中包含 "abc"的人
Person.objects.filter(name__contains = "abc")
# 7. 名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__icontains = "abc")
# 8. 正则表达式查询
Person.objects.filter(name__regex = "^abc")
# 9. 正则表达式不区分大小写
Person.objects.filter(name__iregex = "^abc")
# 10. 排除包含 WZ 的Person对象
Person.objects.exclude(name__contains = "WZ")
# 11. 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age = 23)
有关模型的操作以及 Fields 的更多内容可以查看下列资料:
- Django models 官方教程
- Fields相关官方文档