쿼리셋을 알기전에 ORM 이란 것부터 알고 넘어가ㅈ..
orm이란 원래 데이터베이스(DB)는 sql문, sql언어로써 읽고 쓰고 변경하고 삭제할 수 있는데, 그러지 않고 파이썬은 파이썬 코드로, 루비는 루비 코드로 각 언어의 코드를 사용해서 sql문을 만들어내는 것입니다.
즉, 쿼리(query)란 데이터베이스에 정보를 요청해주는 것입니다.
이 때 파이썬으로 작성한 코드가 SQL문이 mapping되어 쿼리셋(queryset) 이라는 자료 형태로 값이 넘어오게 됩니다.
자주사용되고있는 쿼리셋 api 리스트
- Model method 종류
all() , filter() , exclude() , values() , values_list()
get() , create() , count() , exists() , update() , delete() , first() , last()
all()
filter() & exclude()
values()
values_list()
한 테이블의 모든 레코드를 가져오려면 아래와 같이 all() method를 사용합니다. 그 결과로 QuerySet 을 반환합니다. QuerySet 안에는 각각 인스턴스가 포함되어 있습니다.
In : Category.objects.all()
Out : <QuerySet [<Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>, <Category: Category object (5)>, <Category: Category object (6)>]
filter() method는 가장 자주 사용하는 필터 기능입니다. filter(**kwargs): 키워드 인자로 주어진 lookup 조건에 일치하는 레코드들의 QuerySet을 반환합니다.
In : Category.objects.filter(name='벨로그')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]
In : Category.objects.filter(name='벨로그').exclude(id=3)
Out : [<Category: Category object (4)>]
모델 인스턴스가 아닌 dictionary을 포함하는 QuerySet을 반환합니다.
In : Category.objects.filter(name='브루드커피').values()
Out : <QuerySet [{'id': 3, 'name': '벨로그'}, {'id': 4, 'name': '벨로그'}]>
Table에 데이터를 추가(INSERT) 해주는 method로, 생성된 인스턴스를 반환해줍니다.
In : Category.objects.create(name='벨로그')
Out : <Category: Category object (1)>
지정된 조회 매개 변수와 일치하는 하나의 인스턴스만를 반환합니다.
In : Category.objects.get(name="벨로그")
Out : <Category: Category object (1)>
지정된 필드에 대해 업데이트 쿼리를 수행하고 일치하는 행 수를 반환합니다.
In : Category.objects.filter(name='벨로그').update(name='블로그')
Out : 2 #총 업데이트된 row 개수
QuerySet의 모든 행에 대해 SQL 삭제 쿼리를 수행하고 삭제 된 개체 수와
개체 유형별 삭제 횟수가 있는 dictionary를 반환합니다.
In : Category.objects.filter(name='벨로그').delete()
Out : (1, {'products.Category': 1})
INSERT 또는 UPDATE 를 수행하는 method로, 단일 객체에 대해서 업데이트를 수행할 때 많이 사용됩니다.
In : category = Category.objects.get(id=1)
Out : <Category: Category object (1)>
In : category.name
Out : '벨로그'
In : category.name = 'new blog'
In : category.save()
In : category.name
Out : 'new blog'
filter()와 함께 서용해서 filter 조건에 맞는 데이터가 있는지 조회, 존재하면 True 존재하지 않으면 False를 반환합니다.
In : Category.objects.filter(name='벨로그').exists()
Out : True