django QuerySet에서 자주 사용되고 흔치 않은 기교들

3083 단어 django조회queryset
최근의 작업은django rest입니다. 업무가 좀 복잡하기 때문에 모델 부분에 여러 가지 조회가 있습니다. 어떤 것은 확실히 이전에 사용하지 않았던 것들입니다. Q, F, 이것은 모두 털입니다.

QuerySet


엔트리 같아.Objects.all (), 이 동작들은QuerySet 대상을 되돌려줍니다. 이 대상은 비교적 특별합니다. Objects를 실행하는 것이 아닙니다.all(), 또는 Filter 이후에 데이터베이스와 상호작용을 할 것입니다. 구체적으로 공식 문서를 참고하고 데이터베이스와 상호작용하는 상황:
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 , 

Q 및 F

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은 한 모델의 두 필드가 같은지 판단한다'.
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를Complexlookups with Qobjects에 놓으면 Q는 복잡한 조회를 하는 것을 알 수 있다
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

어떤 필드가null인지 판단합니다

_tasks = tasks.exclude(group__isnull=True)

각종 쌍하강선에 대응하는 각종 방법, 문서querysets field lookup 참조
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#field-lookups

QuerySet !=


예를 들어 모델은 두 열이 있는데 한 열은user라고 하고 한 열은assigned 라고 한다user, 요구 사항은 user를 꺼내는 것입니다!=1의 기록,django에서는 사용할 수 없습니다! =,Q가 필요해요.
from django.db.models import Q
direct_comment = _tasks.filter(~Q(user=1))

Q 이렇게 할 수도 있고,user = 1 또는 2의 원소
direct_comment = _tasks.filter(Q(user=1) | Q(user=2))

QuerySet에서 모델 두 필드가 같은지 판단

from django.db.models import F

 model    user, assigned_user,
 user=assigned_user 

direct_comment = _tasks.filter(user=F('assigned_user'))

django group_by


일부 검색된 QuerySet에 대해 그룹을 나누는 것은 여전히 흔한 일이다
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]

건더기


django issue

좋은 웹페이지 즐겨찾기