__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

来源:http://www.verydemo.com/demo_c374_i6302.html
类似的文章:
Django QuerySet API
http://www.ziqiangxuetang.com/django/django-queryset-api.html
django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
http://www.douban.com/note/301166150/
django QuerySet里那些常用又不常见的技巧
http://my.oschina.net/duoduo3369/blog/199190

django fields lookup methods(lookup类型)的更多相关文章

  1. Core Java Volume I — 4.4. Static Fields and Methods

    4.4. Static Fields and MethodsIn all sample programs that you have seen, the main method is tagged w ...

  2. django源码分析---- Model类型&Field类型

    djiango在数据库这方式自己实现了orm(object relationship mapping 对象关系模型映射).这个主要是用到python 元类这一 项python中的高级技术来实现的. c ...

  3. PMD - Avoid autogenerated methods to access private fields and methods of inner / outer classes

    PMD错误 Avoid autogenerated methods to access private fields and methods of inner / outer classes 样例 p ...

  4. 【Java基础】Java反射——Private Fields and Methods

    Despite the common belief it is actually possible to access private fields and methods of other clas ...

  5. Django中的常用字段类型与参数

    Django中的常用字段类型 1. 数值型 以下都是数值相关的,比如AutoField,它在MySQL中的类型为int(11),而BooleanField在MySQL中对应的类型是tinyint(1) ...

  6. [django]date类型和datetime类型过滤

    搞清楚datetime.datetime和datetime.date模块 他们两个的格式区别 datetime模块 In [1]: from datetime import datetime In [ ...

  7. Django models 的常用字段类型和字段参数

    <1> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符 ...

  8. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

  9. Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)

    方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...

随机推荐

  1. Spring boot请求参数

    GET请求: 1.restful风格: @GetMapping("/order/detail") public BaseOutput omsQueryDetail(@Request ...

  2. Grafana +Zabbix 系列二

    Grafana +Zabbix 系列二 Grafana 简介补充 Grafana自身并不存储数据,数据从其他地方获取.需要配置数据源 Grafana支持从Zabbix中获取数据 Grafana优化图形 ...

  3. CPU中断的机制概论

    cpu的数学模型是图灵机,图灵机是一个线性运行指令的机器,它的执行序列是完全确定的,中断机制是使得cpu具有异步处理能力的机制,就是先暂停他的序列  来执行一些其他指令.具体来说就是,从硬件实现上,其 ...

  4. 7月清北学堂培训 Day 1

    今天是林永迪老师的讲授~ 基础算法 1. 模拟算法 面向测试算法 模拟算法的关键就是将人类语言翻译成机器语言. 要做到以下两点: 1.优秀的读题能力: 2.优秀的代码能力: 程序流程图: 读入,循环处 ...

  5. MySQL数据分析-(8)SQL基础操作之库操作

    前面我们讲了学习SQL的两个逻辑框架,jacky说了这样一个逻辑:库是为了存储表的,所以一定是先有库才有表:同样的道理,有表才有表中的数据,是吧,肯定是这个逻辑:那么,今天jacky就捋着这个逻辑从库 ...

  6. 解决oracle服务占用内存过高的问题

    其实这是因为安装Oracle时,为了均衡电脑性能和数据库性能,默认内存大小为物理内存的1/8,自身内存比较大时,oracle所占的内存也会变大.而通常,我们自己的环境并不需要分配那么大的内存来支持Or ...

  7. Java并发指南5:JMM中的final关键字解析

    本文转载自互联网,侵删   与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的 ...

  8. ubuntu 无法访问windows使用的磁盘

    安装双系统的电脑,正常情况下Ubuntu是可以访问windows下使用的磁盘的, 当出现如下图所示问题时: Windows没有正常关闭. 解决方法: sudo apt-get install ntfs ...

  9. NodeJS的exports、module.exports与ES6的export、export default深入详解

    前言 决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那 ...

  10. MapReduce Combiner

    Combiner编程(可选步骤,视情况而定!) combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能. 如果不用combiner,那么所有的结果都是reduce ...