标签:
一、Django QuerySet API |
Django模型中我们学习了一些基本的创建和查询。这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节。如果以后用到数据库相关的时候也可以在看看。
从数据库中查询出来的结果一般是一个集合,这个集合叫做QuerySet。
文中的例子大部分是基于这个blog/models.py
from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __unicode__(self): # __str__ on Python 3 return self.name class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __unicode__(self): # __str__ on Python 3 return self.name class 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 >>> b = Blog(name=‘Beatles Blog‘, tagline=‘All the latest Beatles news.‘) >>> b.save() 总之,一共有四种方法 # 方法 1 Author.objects.create(name="wulaoer", email="wulaoer@163.com") # 方法 2 twz = Author(name="wulaoer", email="wulaoer@163.com") twz.save() # 方法 3 twz = Author() twz.name="wulaoer" twz.email="wulaoer@163.com" # 方法 4,首先尝试获取,不存在就创建,可以防止重复 Author.objects.get_or_create(name="wulaoer", email="wulaoer@163.com") # 返回值(object, True/False)
备注:前三种方法返回的都是对应的object,最后一种方法返回的是一个元组,(object,True/False),创建时返回True,已经存在时返回False
当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来
>>> from blog.models import Entry >>> entry = Entry.objects.get(pk=1) >>> cheese_blog = Blog.objects.get(name="Cheddar Talk") >>> entry.blog = cheese_blog >>> entry.save()
2、获取对象的方法(上一篇的部分代码)
Person.objects.all() # 查询所有 Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引,后面有相应解决办法,第7条 Person.objects.get(name="wulaoer") # 名称为 wulaoer 的一条,多条会报错 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岁的
3、QuerySet是可迭代的,比如:
es = Entry.objects.all() for e in es: print(e.headline)
Entry.objects.all()或者es就是QuerySet是查询所有的Entry条目。
注意事项:
(1)、如果只是检查Entry中是否有对象,应该用Entry.objects.all().exists()
(2)、
标签:
原文地址:http://www.cnblogs.com/wulaoer/p/5276050.html