python-django-ORM,常用查詢方式


介紹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()

  

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM