- 浏览: 47762 次
- 性别:
- 来自: 成都
最新评论
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __unicode__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
def __unicode__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateTimeField()
authors = models.ManyToManyField(Author)
def __unicode__(self):
return self.headline
这 是model,有blog,author,以及entry;其中entry分别与blog与author表关 联,entry与blog表是通过 外键(models.ForeignKey())相连,属于一对多的关系,即一个entry对应多个blog,entry与author是多对多的关系, 通过modles.ManyToManyField()实现。
一、插入数据库,用save()方法实现,如下:
>>> from mysite.blog.models import Blog
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
>>> b.save()
二、更新数据库,也用save()方法实现,如下:
>> b5.name = 'New name'
>> b5.save()
保存外键和多对多关系的字段,如下例子:
更新外键字段和普通的字段一样,只要指定一个对象的正确类型。
>>> cheese_blog = Blog.objects.get (name="Cheddar Talk")
>>> entry.blog = cheese_blog
>>> entry.save()
更新多对多字段时又一点不太一样,使用add()方法添加相关联的字段的值。
>> joe = Author.objects.create(name="Joe")
>> entry.authors.add(joe)
三、检索对象
>>> Blog.objects
<django .db.models.manager.Manager object at ...>
>>> b = Blog(name='Foo', tagline='Bar')
>>> b.objects
Traceback:
...
AttributeError: "Manager isn't accessible via Blog instances."
1、检索所有的对象
>>> all_entries = Entry.objects.all()
使用all()方法返回数据库中的所有对象。
2、检索特定的对象
使用以下两个方法:
fileter(**kwargs)
返回一个与参数匹配的QuerySet,相当于等于(=).
exclude(**kwargs)
返回一个与参数不匹配的QuerySet,相当于不等于(!=)。
Entry.objects.filter (pub_date__year=2006)
不使用Entry.objects.all().filter (pub_date__year=2006),虽然也能运行,all()最好再获取所有的对象时使用。
上面的例子等同于的sql语句:
slect * from entry where pub_date_year='2006'
链接过滤器:
>>> Entry.objects.filter (
... headline__startswith='What'
... ).exclude(
... pub_date__gte=datetime.now()
... ).filter (
... pub_date__gte=datetime(2005, 1, 1)
... )
最后返回的QuerySet是headline like 'What%' and put_date<now() and pub_date>2005-01-01
另外一种方法:
>> q1 = Entry.objects.filter (headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.now())
>> q3 = q1.filter (pub_date__gte=datetime.now())
这种方法的好处是可以对q1进行重用。
QuerySet是延迟加载
只在使用的时候才会去访问数据库,如下:
>>> q = Entry.objects.filter (headline__startswith="What")
>>> q = q.filter (pub_date__lte=datetime.now())
>>> q = q.exclude(body_text__icontains="food")
>>> print q
在print q时才会访问数据库。
其他的QuerySet方法
>>> Entry.objects.all()[:5]
这是查找前5个entry表里的数据
>>> Entry.objects.all()[5:10]
这是查找从第5个到第10个之间的数据。
>>> Entry.objects.all()[:10:2]
这是查询从第0个开始到第10个,步长为2的数据。
>>> Entry.objects.order_by('headline')[0]
这是取按headline字段排序后的第一个对象。
>>> Entry.objects.order_by('headline')[0:1].get ()
这和上面的等同的。
>>> Entry.objects.filter (pub_date__lte='2006-01-01')
等同于SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';
>>> Entry.objects.get (headline__exact="Man bites dog")
等同于SELECT ... WHERE headline = 'Man bites dog';
>>> Blog.objects.get (id__exact=14) # Explicit form
>>> Blog.objects.get (id=14) # __exact is implied
这两种方式是等同的,都是查找id=14的对象。
>>> Blog.objects.get (name__iexact="beatles blog")
查找name="beatles blog"的对象,不去饭大小写。
Entry.objects.get (headline__contains='Lennon')
等同于SELECT ... WHERE headline LIKE '%Lennon%';
startswith 等同于sql语句中的 name like 'Lennon%',
endswith等同于sql语句中的 name like '%Lennon'.
>>> Entry.objects.filter (blog__name__exact='Beatles Blog')
查找entry表中外键关系blog_name='Beatles Blog'的Entry对象。
>>> Blog.objects.filter (entry__headline__contains='Lennon')
查找blog表中外键关系entry表中的headline字段中包含Lennon的blog数据。
Blog.objects.filter (entry__author__name='Lennon')
查找blog表中外键关系entry表中的author字段中包含Lennon的blog数据。
Blog.objects.filter (entry__author__name__isnull=True)
Blog.objects.filter (entry__author__isnull=False,entry__author__name__isnull=True)
查询的是author_name为null的值
Blog.objects.filter (entry__headline__contains='Lennon',entry__pub_date__year=2008)
Blog.objects.filter (entry__headline__contains='Lennon').filter ( entry__pub_date__year=2008)
这两种查询在某些情况下是相同的,某些情况下是不同的。第一种是限制所有的blog数据的,而第二种情况则是第一个filter 是
限制blog的,而第二个filter 则是限制entry的
>>> Blog.objects.get (id__exact=14) # Explicit form
>>> Blog.objects.get (id=14) # __exact is implied
>>> Blog.objects.get (pk=14) # pk implies id__exact
等同于select * from where id=14
# Get blogs entries with id 1, 4 and 7
>>> Blog.objects.filter (pk__in=[1,4,7])
等同于select * from where id in{1,4,7}
# Get all blog entries with id > 14
>>> Blog.objects.filter (pk__gt=14)
等同于select * from id>14
>>> Entry.objects.filter (blog__id__exact=3) # Explicit form
>>> Entry.objects.filter (blog__id=3) # __exact is implied
>>> Entry.objects.filter (blog__pk=3) # __pk implies __id__exact
这三种情况是相同的
>>> Entry.objects.filter (headline__contains='%')
等同于SELECT ... WHERE headline LIKE '%\%%';
Caching and QuerySets
>>> print [e.headline for e in Entry.objects.all()]
>>> print [e.pub_date for e in Entry.objects.all()]
应改写为:
>> queryset = Poll.objects.all()
>>> print [p.headline for p in queryset] # Evaluate the query set.
>>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.、
这样利用缓存,减少访问数据库的次数。
四、用Q对象实现复杂的查询
Q(question__startswith='Who') | Q(question__startswith='What')
等同于WHERE question LIKE 'Who%' OR question LIKE 'What%'
Poll.objects.get (
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
等同于SELECT * from polls WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
Poll.objects.get (
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who')
等同于Poll.objects.get (question__startswith='Who', Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
五、比较对象
>>> some_entry == other_entry
>>> some_entry.id == other_entry.id
六、删除
Entry.objects.filter (pub_date__year=2005).delete()
b = Blog.objects.get (pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
Entry.objects.all().delete()
删除所有
七、一次更新多个值
# Update all the headlines with pub_date in 2007.
Entry.objects.filter (pub_date__year=2007).update(headline='Everything is the same')
>>> b = Blog.objects.get (pk=1)
# Change every Entry so that it belongs to this Blog.
>>> Entry.objects.all().update(blog=b)
如果用save()方法,必须一个一个进行保存,需要对其就行遍历,如下:
for item in my_queryset:
item.save()
关联对象
one-to-many
>>> e = Entry.objects.get (id=2)
>>> e.blog # Returns the related Blog object.
>>> e = Entry.objects.get (id=2)
>>> e.blog = some_blog
>>> e.save()
>>> e = Entry.objects.get (id=2)
>>> e.blog = None
>>> e.save() # "UPDATE blog_entry SET blog_id = NULL ...;"
>>> e = Entry.objects.get (id=2)
>>> print e.blog # Hits the database to retrieve the associated Blog.
>>> print e.blog # Doesn't hit the database; uses cached version.
>>> e = Entry.objects.select_related().get (id=2)
>>> print e.blog # Doesn't hit the database; uses cached version.
>>> print e.blog # Doesn't hit the database; uses cached version
>>> b = Blog.objects.get (id=1)
>>> b.entry_set.all() # Returns all Entry objects related to Blog.
# b.entry_set is a Manager that returns QuerySets.
>>> b.entry_set.filter (headline__contains='Lennon')
>>> b.entry_set.count()
>>> b = Blog.objects.get (id=1)
>>> b.entries.all() # Returns all Entry objects related to Blog.
# b.entries is a Manager that returns QuerySets.
>>> b.entries.filter (headline__contains='Lennon')
>>> b.entries.count()
You cannot access a reverse ForeignKey Manager from the class; it must be accessed from an instance:
>>> Blog.entry_set
add(obj1, obj2, ...)
Adds the specified model objects to the related object set.
create(**kwargs)
Creates a new object, saves it and puts it in the related object set. Returns the newly created object.
remove(obj1, obj2, ...)
Removes the specified model objects from the related object set.
clear()
Removes all objects from the related object set.
many-to-many类型:
e = Entry.objects.get (id=3)
e.authors.all() # Returns all Author objects for this Entry.
e.authors.count()
e.authors.filter (name__contains='John')
a = Author.objects.get (id=5)
a.entry_set.all() # Returns all Entry objects for this Author.
one-to-one 类型:
class EntryDetail(models.Model):
entry = models.OneToOneField(Entry)
details = models.TextField()
ed = EntryDetail.objects.get (id=2)
ed.entry # Returns the related Entry object
使用sql语句进行查询:
def my_custom_sql(self):
from django .db import connection
cursor = connection.cursor()
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
发表评论
-
django 自定义校验
2012-12-17 14:57 1073#A validator is a callable ... -
django 每输出特定数目的objects后换行
2012-12-14 21:38 1124<table id='vlist'> ... -
openshift+django+mysql git push时候不同步数据库解决方法
2012-12-12 16:14 14891. ssh登陆 2. cd python2.6 3. s ... -
django模板输出HTML去掉自动转义
2012-12-11 20:17 1142{% autoescape off %} {{ art ... -
django中文编码
2012-12-11 01:15 794确保.py,html文件是utf-8编码 html:在 ... -
周报周报
2012-10-12 16:44 010-9 几个后台页面中导航条下拉效果失效的问题 ... -
Pinax搭建第一个站点
2012-08-17 15:54 15411. 安装virtualenv: virtualenv 用 ... -
Django User
2012-08-13 14:32 16061:使用User对象 User 对象属性:usern ... -
mimetype
2012-07-13 10:46 893django里生成txt,csv,pdf 文件: ... -
Django使用mysql 语句
2012-06-20 16:30 1124https://docs.djangoproject.com/ ... -
使用django_debug_tolbar
2012-06-19 15:10 1072下载地址:https://github.com/dcramer ... -
转: Django 国际化实例及原理分析
2012-06-04 14:19 1102From: http://www.oschina.net ... -
Django分页
2012-05-29 13:26 1019包含import相关类from django.core. ... -
Django分页
2012-09-28 16:40 887包含import相关类from django.core. ... -
Pydev使用小技巧
2012-05-28 15:48 1601添加注释块: Ctrl + 4 #====== ... -
Django工作笔记
2012-05-24 11:10 717获取objects里面的name字段的所有值的列表: obje ...
相关推荐
主要介绍了django 数据库返回queryset实现封装为字典,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Book表的数据显示 id title price publish_id 2 Linux 30 1 3 项塔兰 45 2 ... ret1 = Book.objects.all()[0] #QuerySet支持索引,切片操作 # print(ret1) #linux 得到一个具体的对象 ret2 = Book.objec
从本质上讲,它为从Django数据库queryset API构建表格数据提供了一个聪明而明智的前端-尤其是values , filter , order_by和少数批注。 内容 将数据询问器添加到您的INSTALLED_APPS : INSTALLED_APPS = ( # ....
主要介绍了Python的Django框架实现数据库查询(不返回QuerySet的方法)
代码伺候: 先看如下代码: 例1: message = Message.objects.filter(pk=message_id2) ...可正常从QuerySet中读取数据,并打印出来,无误。可是无法将数据同步到数据库中。 (1)all()返回的是
我就废话不多说了,大家还是直接看代码吧! contacts = ExternalContacts.objects.filter...合并出来的queryset,再去重。 补充知识:Python——深入理解urllib、urllib2及requests(requests不建议使用?)
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据。 filter():返回满足条件的数据。 exclude():...
将app添加值settings.py中,然后配置settings连接数据库。 在app中的models中新建模型: from django.db import models # Create your models here. class Author(models.Model): """作者模型""" name = models....
背景描述 最近在使用 Django 时,发现...具体来说,就是使用 QuerySet 对象来检索数据, 而 QuerySet 本质上是通过在预先定义好的 model 中的 Manager 和数据库进行交互。 Manager 是 Django model 提供数据库查询的一
数据库设计如下: Models.py 内容如下: from django.db import models class Province(models.Model): name = models.CharField(max_length=10) def __unicode__(self): return self.name class City(models....
它不缓存QuerySet,而是缓存对象列表的主键。 这样可以加快分页进度。 使用建议 将此软件包与redis等缓存服务器一起使用。 该软件包用于大型数据库表。 如果所需的查询集很复杂,则此分页器会有所帮助,因为它...
操作:models.表名.objects.方法() <BR>all(): 查询所有结果 filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件...
强大的数据库 ORM,拥有强大的数据库操作接口(QuerySet API),可以轻松执行原生 SQL。 易用的模板系统,自带强大、易扩展的模板系统。 国际化支持,支持多语言应用,允许定义翻译的文字,轻松翻译成不同国家/地区...
QuerySet: 执行查询 | QuerySet 方法参考 | 查询表达式 Model 实例: 实例方法 | 访问关联的对象 迁移: 迁移概述 | 操作参考 | SchemaEditor | 编写迁移 高级: 管理员 | 原始 SQL | 事务 | 聚合 | 搜索 | 自定义字段 ...
1、下述代码查询model对应数据库中日期等于2018-05-22的数据: queryset = model.objects.all() condtions: {'date': '2018-05-22'} query_res = queryset.filter(**condtions) 2、下述代码查询model对应数据库中...
from django.db import models # Create your models here. class Book(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5,decimal_places=2) 然后执行python ...
任务库 tasklib是一个Python库,用于使用与Django ORM类似的queryset API与数据库进行交互。要求Python 3.5或更高版本 v2.1.x或更高版本。 较旧的taskwarrior版本未经测试,可能无法正常工作。安装通过pip安装: pip...
石墨烯-Django优化剂 使用Django QuerySet的 , 和方法,自动优化由执行的查询。安装pip install graphene-django-optimizer用法具有基于的以下架构(注意使用gql_optimizer ) # cookbook/ingredients/schema.py...