介紹django model 的一些常用查詢方式
首先是一些文檔性的幫助
__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 class Blog(models.Model): 2 name = models.CharField(max_length=100) 3 tagline = models.TextField() 4 5 def __unicode__(self): 6 return self.name 7 8 class Author(models.Model): 9 name = models.CharField(max_length=50) 10 email = models.EmailField() 11 12 def __unicode__(self): 13 return self.name 14 15 class Entry(models.Model): 16 blog = models.ForeignKey(Blog) 17 headline = models.CharField(max_length=255) 18 body_text = models.TextField() 19 pub_date = models.DateTimeField() 20 authors = models.ManyToManyField(Author) 21 22 def __unicode__(self): 23 return self.headline
這里一個Entry關聯一個blog和多個Authors
對對象的一些操作:
增加:
通過save()方法
from mysite.blog.models import Blog b = Blog(name=’Beatles Blog’, tagline=’All the latest Beatles news.’) b.save()
修改:
也可通過save方法
1 b5.name = ‘New name’ 2 b5.save()
關於有外鍵的,可以直接通過參數列表或者賦值后save.
1 cheese_blog = Blog.objects.get(name=”Cheddar Talk”) 2 entry.blog = cheese_blog 3 entry.save()
關於有多對多關系的,不能直接更新,需要model實例.多對多關系的成員名.add(model)。
joe = Author.objects.create(name=”Joe”)
entry.authors.add(joe)
查找:
檢索所有對象:
all_entries = Entry.objects.all()
檢索特定的對象
使用以下兩個方法:
fileter(**kwargs)
返回一個與參數匹配的QuerySet,相當於等於(=).
exclude(**kwargs)
返回一個與參數不匹配的QuerySet,相當於不等於(!=)。
QuerySet方法
1 # 這是查找前5個entry表里的數據 2 Entry.objects.all()[:5] 3 # 這是查找從第5個到第10個之間的數據。 4 Entry.objects.all()[5:10] 5 # 這是查詢從第0個開始到第10個,步長為2的數據。 6 Entry.objects.all()[:10:2] 7 # 模糊查詢 8 Entry.objects.get(headline__contains=’Lennon’)
接下來是一些ORM提供的比較酷的方法:
1 Entry.objects.filter(blog__name__exact=’Beatles Blog’) 2 # 查找entry表中外鍵關系blog_name=’Beatles Blog’的Entry對象。 3 Blog.objects.filter(entry__headline__contains=’Lennon’) 4 # 查找blog表中外鍵關系entry表中的headline字段中包含Lennon的blog數據。 5 Blog.objects.filter(entry__author__name=’Lennon’) 6 # 查找blog表中外鍵關系entry表中的author字段中包含Lennon的blog數據。 7 Blog.objects.filter(entry__author__name__isnull=True) 8 Blog.objects.filter(entry__author__isnull=False,entry__author__name__isnull=True) 9 # 查詢的是author_name為null的值 10 11 Blog.objects.filter(entry__headline__contains=’Lennon’,entry__pub_date__year=2008) 12 Blog.objects.filter(entry__headline__contains=’Lennon’).filter( entry__pub_date__year=2008) 13 # 這兩種查詢在某些情況下是相同的,某些情況下是不同的。第一種是限制所有的blog數據的,而第二種情況則是第一個filter是 14 # 限制blog的,而第二個filter則是限制entry的 15 16 Blog.objects.filter(pk__in=[1,4,7]) 17 # id in 1,4,7 18 Blog.objects.filter(pk__gt=14) 19 # id = 14
Q對象的復雜查詢
1 Q(question__startswith=’Who’) | Q(question__startswith=’What’) 2 3 Poll.objects.get(Q(question__startswith=’Who’), 4 Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) 5 )
刪除:
Entry.objects.filter(pub_date__year=2005).delete()
Entry.objects.all().delete()
反向查詢:
先展示一個model
1 from django.db import models 2 3 class Publisher(models.Model): 4 5 name = models.CharField(max_length=30) 6 address = models.CharField(max_length=50) 7 city = models.CharField(max_length=60) 8 state_province = models.CharField(max_length=30) 9 country = models.CharField(max_length=50) 10 website = models.URLField() 11 12 def __unicode__(self): 13 return self.name 14 15 class Author(models.Model): 16 17 first_name = models.CharField(max_length=30) 18 last_name = models.CharField(max_length=40) 19 email = models.EmailField() 20 21 def __unicode__(self): 22 return u'%s %s' % (self.first_name, self.last_name) 23 class Book(models.Model): 24 25 title = models.CharField(max_length=100) 26 authors = models.ManyToManyField(Author) 27 publisher = models.ForeignKey(Publisher) 28 publication_date = models.DateField() 29 30 def __unicode__(self): 31 return self.title
一個作者一本書和一個出版社,一本書可以被多個作者撰寫,但是只屬於一個出版社
反向查詢方法:
p = Publisher.objects.get(name='Apress Publishing') p.book_set.filter(name__icontains='django') # 屬性名稱book_set是由模型名稱的小寫 ( 如 book) 加_set組成的。 # 通過出版社,得到與它有外鍵關聯的書籍名稱叫django的書
訪問多對多:
1 b = Book.objects.get(id=50)
2 b.authors.all()