最近的做业是django rest,业务有点复杂,所以model部分会有各类查询,有些确实以前不多 用到的东西,向Q,F,这都是毛啊git
像Entry.Objects.all(),这些操做返回的是一个QuerySet对象,这个对象 比较特别,并非执行Objects.all(),或者filter以后就会与数据库交互, 具体参看官方文档,与数据库交互的状况:sql
https://docs.djangoproject.com/en/dev/ref/models/querysets/数据库
Internally, a QuerySet can be constructed, filtered, sliced, and generally passed around without actually hitting the database. No database activity actually occurs until you do something to evaluate the queryset. 能够print queryset对象的query属性查看具体sql 1. list(Entry.Objects.all()) 2. for e in Entry.Objects.all():pass # 便利第一个元素的时候会触发数据库操做 3. Entry.Objects.all()[2:10] # 这种状况不会返回全部元素,sql中会加上limit的,分页能够利用这一点
F class from django.db.models import F Instances of F() act as a reference to a model field within a query. These references can then be used in query filters to compare the values of two different fields on the same model instance.
这就是说F是专门取对象中某列值的,例子: 'QuerySet 判断一个model两个字段是否相等'django
Q class from django.db.models import Q Keyword argument queries – in filter(), etc. – are “AND”ed together. If you need to execute more complex queries (for example, queries with OR statements), you can use Q objects.
从文档把Q放在Complex lookups with Q objects,下就能够看出,Q是作复杂查询的app
and --> XX.objects.filter(Q(f=1),Q(f=2)) # 确定木有结果 f == 1 and f == 2 or --> XX.objects.filter(Q(f=1) | Q(f=2)) # f ==1 | f == 2 not --> XX.objects.filter(~Q(f=1),Q(f=2)) # f != 1 and f == 2
_tasks = tasks.exclude(group__isnull=True)
各类双下滑线对应的各类方法,参看文档 querysets field lookuplua
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#field-lookups
例如model 有两列 一列叫作user,一列叫作assigned_user, 需求是取出user!=1的记录,django里面不能使用!=,须要用Q.net
from django.db.models import Q direct_comment = _tasks.filter(~Q(user=1))
Q还能够这样,user = 1或者2的元素rest
direct_comment = _tasks.filter(Q(user=1) | Q(user=2))
from django.db.models import F 例如model 有两列 一列叫作user,一列叫作assigned_user, 需求是取出user=assigned_user的记录 direct_comment = _tasks.filter(user=F('assigned_user'))
对某些取到的QuerySet分组仍是很常见的code
def group_by(query_set, group_by): '''util:django 获取分类列表''' assert isinstance(query_set, QuerySet) django_groups = query_set.values(group_by).annotate(Count(group_by)) groups = [] for dict_ in django_groups: groups.append(dict_.get(group_by)) return groups 例如: assign_to = _tasks.exclude(user=F('assigned_user')) groups = group_by(assign_to, 'group') 取出的是一个列表groups = [1L, 3L, 4L]