Object 타입
단일 객체 타입으로 DB의 하나의 Row라고 생각하면된다.
<Dog: Dog object (2)>
QuerySet이란 뭘까!?
여러개의 QueryObject로 이루어져있으며 아래와같은 형태를 보여준다.
<QuerySet [<Dog: Dog object (1)>, <Dog: Dog object (2)>, <Dog: Dog object (3)>]>
QuerySet의 속성
QuerySet은 보이는것과 같이 리스트와 굉장히 흡사한 특성을 지니고 있다.
1. iteration : QuerySet은 반복가능한 객체이다.
2.indexing * slicing : 리스트와 똑같이 인덱싱슬라이싱이 가능하며
3.pickling/caching
4.repr()
5.len() : len을 하면 안에 있는 objects의 갯수가 나오지만 count()메소드를 사용하는것이 더 편하다.
6.list() : 쿼리셋을 리스트화 시킬수있다 반환결과는 아래와 같다.
list(<QuerySet [<Dog: Dog object (1)>, <Dog: Dog object (2)>, <Dog: Dog object (3)>]>)
#결과
[<Dog: Dog object (1)>, <Dog: Dog object (2)>, <Dog: Dog object (3)>]
7.bool() : 쿼리셋은 boolean타입이 지원되며 안에 오브젝트가 없는 빈 쿼리셋일경우 False이고 나머지는 True이다.
QuerySet의 자기정보를 알아볼 수 있는 attributes
ordered : 정렬 여부를 알 수 있습니다.
쿼리셋.ordered
정렬 순서가 없을시 False가 나타납니다.
db : 이쿼리가 지금 실행 될 경우 사용할 데이터베이스를 알려 줍니다.
쿼리셋.db
Field lookups
필드 룩업이란?
QuerySet 메서드 filter(), exclude() 및 get()에 대한 키워드 인수로 지정됩니다.
(__룩업)으로 사용됩니다.
SQL의 WHERE절의 조건에 해당됩니다.
초과 / 이상 / 미만 /이하
- gt : 초과
- gte : 이상
- lt : 미만
- lte : 이하
exact : = 를 의미합니다.
__exact = None 입력시 SQL은 Null로 인식합니다.
#Python
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
#SQL
SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;
iexact : =를 의미합니다. (대소문자를 구분하지 않고)
__iexact = None 입력시 SQL은 Null로 인식합니다.
#Python
Blog.objects.get(name__iexact='beatles blog')
Blog.objects.get(name__iexact=None)
#SQL
SELECT ... WHERE name ILIKE 'beatles blog';
SELECT ... WHERE name IS NULL;
#'Beatles Blog' / 'BEATLES BLOG' / 'beatles blog' 다 같은걸로 인식합니다.
contains : 지정한 문자열이 포함된값을 찾습니다. (대소문자를 구분합니다.)
#Python
Entry.objects.get(headline__contains='Lennon')
#SQL
SELECT ... WHERE headline LIKE '%Lennon%';
'Lennon honored today' 는 출력되지만 'lennon honored today' 는 출력되지 않습니다.
icontains : 지정한 문자열이 포함된값을 찾습니다. (대소문자를 구분하지않습니다.)
#Python
Entry.objects.get(headline__icontains='Lennon')
#SQL
SELECT ... WHERE headline ILIKE '%Lennon%';
startswith : 시작문자열이 매치되는지 찾습니다.(대소문자를 구분 합니다.)
#Python
Entry.objects.filter(headline__startswith='Lennon')
#SQL
SELECT ... WHERE headline LIKE 'Lennon%';
istartswith : 시작문자열이 매치되는지 찾습니다.(대소문자를 구분하지 않습니다.)
#Python
Entry.objects.filter(headline__istartswith='Lennon')
#SQL
SELECT ... WHERE headline ILIKE 'Lennon%';
endswith : 종료문자열이 매치되는지 찾습니다.(대소문자를 구분합니다.)
#Python
Entry.objects.filter(headline__endswith='Lennon')
#SQL
SELECT ... WHERE headline LIKE '%Lennon';
iendswith : 종료문자열이 매치되는지 찾습니다.(대소문자를 구분하지않습니다.)
#Python
Entry.objects.filter(headline__iendswith='Lennon')
#SQL
SELECT ... WHERE headline ILIKE '%Lennon'
in : 반복가능객체에서 포함되는지를 찾습니다
#Python
Entry.objects.filter(id__in=[1, 3, 4])
Entry.objects.filter(headline__in='abc')
#SQL
SELECT ... WHERE id IN (1, 3, 4);
SELECT ... WHERE headline IN ('a', 'b', 'c');
range : 범위 사이의 값을 구합니다.
숫자,날짜,시간,문자열까지 가능합니다.
#Python
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
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
날짜로 DateTimeField를 필터링하면 "지정된 날짜의 0am"으로 해석되므로 마지막 날의 항목은 포함되지 않습니다
isnull : null인지 아닌지 구분
#Python
Entry.objects.filter(pub_date__isnull=True)
#SQL
SELECT ... WHERE pub_date IS NULL;
regex : 대소문자를 구분하는 정규표현식
iregex : 대소문자를 구분하지 않는 정규표현식
시간/날짜 lookups
- date
- year
- iso_year
- month
- day
- week
- week_day
- iso_week_day
- quarter
- time
- hour
- minute
- second
'Python > Django' 카테고리의 다른 글
[Django] Westagram 회원가입 기능 작성해보기 ver.2 (0) | 2022.06.13 |
---|---|
[Django] Westagram 회원가입 기능 작성해보기 ver.1 (0) | 2022.06.12 |
[Django]ManyToMany Field 는 왜 사용할까 (0) | 2022.06.08 |
[django.models] ManyToMany 속성 (0) | 2022.06.08 |
[Django.models]외래키필드의 기본속성 (0) | 2022.06.08 |