梦见世界

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

django model 类型说明:https://docs.djangoproject.com/en/1.8/ref/models/fields/

1.django model查询

   1.Person.objects.raw("select * from myapp_person")             # preson为model名 返回多个model实例 可以用for model in models 来提取一个实例 

for p in Person.objects.raw('SELECT * FROM myapp_person'):
    print(p)
a =Person.objects.raw('SELECT * FROM myapp_person')[0] # index使用 会查询数据库
a = Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])  # 参数使用

    2.filter方法,相当于简单的where语句 ,返回model对象    Article.objects.filter(reporter__first_name='John')

    3.get方法,相当于简单的where语句  ,返回model对象      Blog.objects.get(name="Cheddar Talk")  如果有0个或者超过一个的数据,将会报错

    4.all方法,相当于select * from table,返回表中所有tuple

    5.exclude方法,选择表中不满足条件的tuple   q = q.exclude(body_text__icontains="food")

    6.delete方法,Entry.objects.all().delete()

    7.update方法 Entry.objects.filter(blog__name=‘foo‘).update(comments_on=False) 注意不能修改关联表的字段

2.创建model对象,并保存到数据库

from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()

 

3.改变model对象,并保存

b5.name = 'New name'
b5.save()

4. python slice分片在其中的应用 Entry.objects.all()[:10:2]

5 order_by方法:Entry.objects.order_by('headline')[0] 或者Entry.objects.order_by('-headline')倒序

       

6 contains匹配 相当于like   也有忽略大小写的匹配 icontains

# Case-sensitive containment test. For example:

Entry.objects.get(headline__contains='Lennon')  # 注意是双下划线
# Roughly translates to this SQL:

SELECT ... WHERE headline LIKE '%Lennon%';

7. 忽略大小写匹配 iexact   Blog.objects.get(name__iexact="beatles blog")

8 startswithendswith  istartswith,iendswith   

9 外键匹配:Entry.objects.filter(blog__name='Beatles Blog') # 选择entry object where 外键连接的表blog的name属性的值为'Beatles Blog'

10. 数据表in,gt,lt,gte,lte,range等比较操作:

# 下面3个操作是等价的  pk表示primary key
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

Blog.objects.get(pk=14) Blog.objects.filter(pk__in=[1,4,7]) # pk的值在1,4,7中
Blog.objects.filter(pk__gt=14) # pk的值大于14

# range 好似between and操作
import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))

  # SQL equivalent:

SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';

11 比较不同的列

    

from django.db.models import F
Entry.objects.filter(n_comments__gt=F('n_pingbacks'))  # 选取n_comment大于n_pingbacks的tuple

12 queryset的缓存系统:当queryset被创建时cache是空的,当第一次queryset被求值时,django会将query result保存到cache中,然后接下来的有关该query result的查询操作会从cache中提取值

   

queryset = Entry.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.

# 当query set取部分值时,django不会将queryset保存到cache中,从而第二次查询时,会再次查询数据库  
queryset = Entry.objects.all()
print queryset[5] # Queries the database
print queryset[5] # Queries the database again

queryset = Entry.objects.all()
[entry for entry in queryset] # Queries the database print queryset[5] # Uses cache print queryset[5] # Uses cache
# 以下的操作会使得django将result存储到cache中
[entry for entry in queryset]
bool(queryset)
entry in queryset
list(queryset)
 
 

 

13. 利用Q来进行包含或与非的查询,这是对filter的一个扩展,因为filter的参数都是按照与来进行的

from django.db.models import Q
Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))  # |表示或
)

Q(question__startswith='Who') | ~Q(pub_date__year=2005)   # ~表示取反
 

 




posted on 2015-08-17 12:03  梦见世界  阅读(267)  评论(0编辑  收藏  举报