Django QuerySet API
来源:互联网 发布:詹姆斯历年数据 编辑:程序博客网 时间:2024/05/21 17:08
学习Django的时候在这里写了一点数据库创建查询方法 http://blog.csdn.net/u013205877/article/details/76768963 但是比较简单,
在这篇文章比较详细的记录下用法,我挑重要的写,方便自己以后查询,想看更详细的来这里看:http://code.ziqiangxuetang.com/django/django-queryset-api.html
例子 blog/models.py
from django.db import modelsclass Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __unicode__(self): # __str__ on Python 3 return self.nameclass Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __unicode__(self): # __str__ on Python 3 return self.nameclass Entry(models.Model): blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author) n_comments = models.IntegerField() n_pingbacks = models.IntegerField() rating = models.IntegerField() def __unicode__(self): # __str__ on Python 3 return self.headline
1. QuerySet 创建对象的方法
#一共四种方法from blog.models import Blog,Author,Entry#第一种Author.objects.create(name="zhangkun", email="lalalal@qq.com")#第二种zk = Author(name="zhangkun", email="lalalal@qq.com")zk.save()#第三种zk = Author()zk.name="zhangkun"zk.email="lalalal@qq.com"zk.save()#第四种 先读,不存在就创建,防止重复Author.objects.get_or_create(name="zhangkun", email="lalalal@qq.com")# 返回值(object, True/False),创建时返回 True, 已经存在时返回 False
2. QuerySet 获取对象的方法 查询方法
#查询所有的Person.objects.all()#切面,获取10个,不支持负索引,切片可以节约内存,不支持负索引,后面有相应解决办法,第7条Persion.objects.all()[:10]#名称为zhangkun的第一条,多条会报错Person.object.get(name="zhangkun")get只是用来获取第一条对象的,如果需要满足条件的一些人,需要用到filter#名字叫zhangkun的Person.objects.filter(name="zhangkun")#名字严格叫zhangkun的(这和上一条有啥区别?黑人问好脸.jpg)Person.objects.filter(name__exact="zhangkun")#名字严格叫zhangkun,但是不区分大小写,可以找到Zhangkun,ZHANGKUN,都符合条件Person.objects.filter(name__iexact="zhangkun")#名字中包含"zhangkun"的Persin.objects.filter(name__contains="zhangkun")#名字中包含"zhangkun"的,但是不区分大小写Persin.objects.filter(name__icontains="zhangkun")#正则表达式查询Person.objects.filter(name__regex="^abc")#不区分大小写的正则Person.objects.filter(name__iregex="^abc")#排除包含WZ的Person对象Person.objects.exclude(name__contains="WZ")#找出名称中含有abc但是排除23岁的Person.objects.filter(name__contains="abc").exclude(age=23)
3.QuerySet 删除符合条件的结果
Person.objects.filter(name__contains="abc").delete() # 删除 名称中包含 "abc"的人如果写成 people = Person.objects.filter(name__contains="abc")people.delete()效果也是一样的,Django实际只执行一条 SQL 语句。
4. QuerySet 更新某个内容
1 .批量更新,适用于.all() .filter() .exclude()等等后面
#名称中包含abc的人都更为xxxPerson.objects.filter(name__contains="abc").update(name="xxx")#删除所有的Person记录Person.objects.all().delete()
2.单个的object更新,适用于.get(),get_or_create(),update_or_create()等等得到的obj,和新建很类似
twz = Author.objects.get(name="zhangkun")twz.name = "studyDjango"twz.email="learn@qq.com"twz.save()
5. QuerySet 是可迭代的
#ntry.objects.all() 或者 es 就是 QuerySet 是查询所有的 Entry 条目es = Entry.objects.all()for e in es: print(e.headline)
(1) 如果只是检查Entry中是否有对象,用Entry.objects.all().exits()
(2)QuerySet 支持切片 Entry.objetcs.all()[:10]取出10条,节省内存
(3)用len(Entry.objetcs.all())也能得到Entry的数量,但是推荐使用Entry.objects.count()来查询,因为他用的是SQL:SELECT COUNT(*)
(4)list(Entry.objetcs.all()) 可以强行将QuerySet变成列表
6. QuerySet 是可以用pickle序列化到硬盘再读取出来的
#没看懂,有毛用?>>> import pickle>>> query = pickle.loads(s) # Assuming 's' is the pickled string.>>> qs = MyModel.objects.all()>>> qs.query = query # Restore the original 'query'.
7. QuerySet 查询结果排序
作者按照名称排序Author.objects.all().order_by('name')# 在 column name 前加一个负号,可以实现倒序Author.objects.all().order_by('-name')
8. QuerySet 支持链式查询
Author.objects.filter(name__contains="zhangkun").filter(email="lalal@qq.com")Author.objects.filter(name__contains="zhangkun").exclude(email="lalal@qq.com")#找到名字含有abc,年纪排除23的Person.objects.filter(name__contains="abc").exclude(age=23)
9. QuerySet 不支持负索引
Person.objects.all()[:10] 切片操作,前10条Person.objects.all()[-10:] 会报错!!!#1.使用reverse()解决Person.objects.all().reverse()[:2]#最后两条Person.objects.all().reverse()[0]#最后一条#2.使用order_by,在列名前加一个负号Author.objects.order_by('-id')[:20]#id最大的20条,相当于从后往前排的20条数据
9. QuerySet 重复的问题,使用 .distinct() 去重
他说,一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可以会出来重复的值,我觉得这可能是设计有问题哈哈哈哈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()
推荐看原文:http://code.ziqiangxuetang.com/django/django-queryset-api.html
下面还有:
Django QuerySet 进阶内容:
http://code.ziqiangxuetang.com/django/django-queryset-advance.html
Django 自定义Field
http://code.ziqiangxuetang.com/django/django-custom-field.html
Django 数据表更改
http://code.ziqiangxuetang.com/django/django-schema-migration.html
- Django QuerySet API
- Django QuerySet API
- Django - 模型(QuerySet API)
- Django QuerySet API
- Django QuerySet API
- Django QuerySet API 帮助文档
- Django QuerySet的基本API
- Django学习(九)(QuerySet API)
- Django | 查询API参考 (QuerySet API reference) | Django文档
- django-QuerySet
- Django QuerySet
- QuerySet API
- [py]Django 提供的 QuerySet API操作db
- Django数据库queryset操作
- django中的queryset操作
- Django 数据库QuerySet操作
- django queryset values&values_list
- Django数据库queryset操作
- Spring-Boot + Swagger2 自动生成API接口文档
- AIO入门实例
- css样式整体设置
- HTML5_CSS入门(尺寸大小、颜色单位、溢出、哪些元素可以设置尺寸、边框,边框倒角、边框阴影,轮廓)
- Docker Toolbox
- Django QuerySet API
- oracle笔记1-基本用户、权限、表操作
- java简易excel导入导出工具(封装POI)
- Android PATH and ld path
- 百度开发者API接口:获取经纬度和详细地理位置(Geocoding API和IP定位API)
- [随心译]2017.8.6-这就是美国将要在日本和中国进行战斗的巨型机器人
- 关于C#引用dll动态链接库文件的注释问题
- Matrix Power Series
- cacti监控客户端配置