Django - 模型(QuerySet API)

简介: Django - 模型(QuerySet API)一、数据库简单操作# 注意:QuerySet对象是可迭代的1. 创建1.1 Object.
Django - 模型(QuerySet API)

一、数据库简单操作

# 注意:QuerySet对象是可迭代的
1. 创建
1.1 Object.objects.create()
Person.objects.create(name="Demon", age=18)
1.2 new
p = Person(name="Demon",age=18)
p.save()
1.3 Object.objects.get_or_create()
# 这种方法好处是可以方便插入完再去查询,返回两个结果
# @param Person:创建成功后返回的Person对象
# @param boolean:如果要新建的对象已经存在,返回False,新建成功返回 
(Person, boolean)Person.objects.get_or_create(name="Demon",age=18)
2. 查询
2.1 Object.objects.get()

Person.objects.get(name="Demon")
# 这里查询出来的是一个 Person对象,不是我们想要的信息,我们去修改 modules.py
# 注意:字段不能有__(双下划线),在 Django QuerySet API中有特殊含义,也不能使用关键字
# 这里我们要给 modules.py 中的数据库类添加一个 __unicode__()方法
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

2.2 Object.objects.all() - 获取对象所有记录

该方法支持切片操作,不过不支持负索引
Object.objects.all()[:10] 取出10条,可以节省内存

2.2.1 Object.objects.all().exits()

检查该对象在数据库中是否有数据

2.2.2 Object.objects.all().reverse()

用它可以实现倒序查询
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条
2.3 Object.objects.filter()
2.3.1 等于
# 区分大小写
Person.objects.filter(name="abc") # 等Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
# 不区分大小写
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
2.3.2 包含
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
2.3.3 正则表达式
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
2.3.4 排除法
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
# 嵌套使用
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
2.4 链式查询
Author.objects.filter(name__contains="Demon").filter(email="123@163.com")
Author.objects.filter(name__contains="Demon").exclude(email="123@163.com")

# 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age=23)
2.5 查询时去重
qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='WeizhongTu')

# 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的

# 去重方法
qs = qs.distinct()
3. 排序
Object.objects.all().order_by('name')
Object.objects.all().order_by('-name') # 在 column name 前加一个负号,可以实现倒序
二、数据库表更改
1. 当数据库表建好后,后续如果要修改表结构,一般需要进行如下操作:
# Django >= 1.7
python manage.py makemigrations
python manage.py migrate
# Django < 1.7
python manage.py syncdb
# 如果是在原来的基础上删除或增加字段,可以使用下面命令
python manage.py sql appname

2. South

这是一个专门用来做数据库表结构自动迁移的模块,使用方法如下:

2.1 安装

pip install South

2.2 使用

在 Django工程的 settings.py 中的 INSTALL_APPS 中指定:

# Application definition
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
    'south',
)

修改好之后运行一次 python manage.py syncdb,Django 会新建一个 south_migrationhistory表,来记录数据库表变化的历史记录

如果要把之前创建好的app使用south来管理,使用如下命令:

# python manage.py convert_to_south blog

注:如果 blog 这个 app 之前就创建过相关的表,可以用下面的来“假装”用 South 创建(伪创建,在改动 models.py 之前运行这个), 意思是这个表我以前已经建好了,用 South 
只是纪一下这个创建记录,下次 migrate 的时候不必再创建了

# python manage.py migrate blog --fake

接着,当你对 Blog.models 做任何修改后,只要执行: # python manage.py schemamigration blog --auto

# python manage.py schemamigration blog --auto

South就会帮助我们找出哪些地方做了修改,如果你新增的数据表没有给default值,并且没有设置null=True, south会问你一些问题,因为新增的column对于原来的旧的数据不能为Null的
话就得有一个值。顺利的话,在migrations文件夹下会产生一个0002_add_mobile_column.py,但是这一步并没有真正修改数据库的表,我们需要执行:

python manage.py migrate
2.3 回退到以前修改的版本

# 0001 就是我们第一次创建的历史记录
python manage.py migrate blog 0001

相关文章
|
23天前
|
机器学习/深度学习 前端开发 网络架构
Django如何调用机器学习模型进行预测
Django如何调用机器学习模型进行预测
45 5
|
25天前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
32 5
|
25天前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
19 4
|
2月前
|
人工智能 Serverless API
一键服务化:从魔搭开源模型到OpenAI API服务
在多样化大模型的背后,OpenAI得益于在领域的先发优势,其API接口今天也成为了业界的一个事实标准。
一键服务化:从魔搭开源模型到OpenAI API服务
|
23天前
|
存储 开发框架 JSON
【查漏补缺】Django模型字段类型及其应用
【查漏补缺】Django模型字段类型及其应用
13 0
|
3月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
|
3月前
|
存储 数据库 开发者
Django Web架构:全面掌握Django模型字段(下)
Django Web架构:全面掌握Django模型字段(下)
55 2
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
39 0
|
3月前
|
JSON API 数据安全/隐私保护
哇塞!Django REST framework 太逆天啦!构建 API 服务从未如此轻松,你还不来试试?
【8月更文挑战第31天】Django REST framework(DRF)是基于Django框架的高效Web API开发工具,提供序列化、视图集、路由等功能,简化API构建流程。使用DRF可轻松实现数据的序列化与反序列化,并支持权限管理和认证机制以保障API安全。安装DRF只需通过`pip install djangorestframework`命令。要创建基本项目,先安装Django并创建新应用,定义模型、序列化器及视图集,最后配置路由。测试API时,可通过Postman发送HTTP请求验证功能。无论项目大小,DRF均能提供强大支持。
36 0
|
3月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API