對Django數據庫的查詢,限制,過濾等

參考:http://blog.csdn.net/sherlockzoom/article/details/51910061

__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的區別

1、檢索所有的對象

>>> all_entries = Entry.objects.all()
  • 1

使用all()方法返回數據庫中的所有對象。

2、檢索特定的對象

使用以下兩個方法:

fileter(**kwargs) 
  • 1

返回一個與參數匹配的QuerySet,相當於等於(=).

exclude(**kwargs) 
  • 1

返回一個與參數不匹配的QuerySet,相當於不等於(!=)。

Entry.objects.filter(pub_date__year=2006) 
  • 1

不使用Entry.objects.all().filter(pub_date__year=2006),雖然也能運行,all()最好再獲取所有的對象時使用。
上面的例子等同於的sql語句:

select * from entry where pub_date_year=’2006
  • 1

鏈接過濾器:

>>> Entry.objects.filter(
… headline__startswith=’What’
… ).exclude(
… pub_date__gte=datetime.now()
… ).filter(
… pub_date__gte=datetime(2005, 1, 1)
… )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

最後返回的QuerySet是headline like ‘What%’ and put_date2005-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())
  • 1
  • 2
  • 3

這種方法的好處是可以對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
  • 1
  • 2
  • 3
  • 4

在print q時纔會訪問數據庫。

其他的QuerySet方法

>>> Entry.objects.all()[:5]
  • 1

這是查找前5個entry表裏的數據

>>> Entry.objects.all()[5:10]
  • 1

這是查找從第5個到第10個之間的數據。

>>> Entry.objects.all()[:10:2]
  • 1

這是查詢從第0個開始到第10個,步長爲2的數據。

>>> Entry.objects.order_by(‘headline’)[0]
  • 1

這是取按headline字段排序後的第一個對象。

>>> Entry.objects.order_by(‘headline’)[0:1].get()
  • 1

這和上面的等同的。

>>> Entry.objects.filter(pub_date__lte=’2006-01-01′)
  • 1

等同於SELECT * FROM blog_entry WHERE pub_date <= ’2006-01-01′;

 >>> Entry.objects.get(headline__exact=”Man bites dog”)
  • 1

等同於SELECT … WHERE headline = ‘Man bites dog’;

>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14) # __exact is implied
  • 1
  • 2

這兩種方式是等同的,都是查找id=14的對象。

>>> Blog.objects.get(name__iexact=”beatles blog”)
  • 1

查找name=”beatles blog”的對象,不去飯大小寫。

Entry.objects.get(headline__contains=’Lennon’) 
  • 1

等同於SELECT … WHERE headline LIKE ‘%Lennon%’;

startswith 等同於sql語句中的 name like ‘Lennon%’,
endswith等同於sql語句中的 name like ‘%Lennon’.

>>> Entry.objects.filter(blog__name__exact=’Beatles Blog’) 
  • 1

查找entry表中外鍵關係blog_name=’Beatles Blog’的Entry對象。

>>> Blog.objects.filter(entry__headline__contains=’Lennon’)
  • 1

查找blog表中外鍵關係entry表中的headline字段中包含Lennon的blog數據。

Blog.objects.filter(entry__author__name=’Lennon’) 
  • 1

查找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) 
  • 1
  • 2

查詢的是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)
  • 1
  • 2

這兩種查詢在某些情況下是相同的,某些情況下是不同的。第一種是限制所有的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
  • 1
  • 2
  • 3

等同於select * from where id=14

Get blogs entries with id 1, 4 and 7

>>> Blog.objects.filter(pk__in=[1,4,7])
  • 1

等同於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
  • 1
  • 2
  • 3

這三種情況是相同的

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.、
  • 1
  • 2
  • 3

這樣利用緩存,減少訪問數據庫的次數。

四、用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’)
  • 1
  • 2
  • 3

等同於

Poll.objects.get(question__startswith=’Who’, Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
  • 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章