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

原创粉丝点击