django - queryset과 기본 검색 방법

whybein·2020년 2월 8일
5

django

목록 보기
5/13
post-thumbnail

https://docs.djangoproject.com/en/3.0/ref/models/querysets/
https://github.com/django/django/blob/master/django/db/models/query.py

 

1. queryset을 만들어주는 manager의 이름은 objects

프로젝트의 app에 Person이라는 모델이 있습니다. 데이터 필드로는 name, gender, age가 있습니다.

>>> Person
<class 'person.models.Person'>
>>> Person.objects
<django.db.models.manager.Manager object at 0x7f322522bed0>
  • Personmodels.py에서 정의한 클래스입니다.
  • 매니저는 데이터베이스 쿼리를 실행하는 인터페이스로 각 모델(클래스)은 최소 하나씩 갖고 있습니다. 매니저의 초기 이름은 objects입니다. objects란 이름의 managerPerson 데이터베이스를 QuerySet의 형태로 만들게 되며 그 QuerySet에서 데이터를 검색할 수 있습니다.
    - 초기 이름인 objects를 다른 것으로 바꿀 수 있고 QuerySet의 결과값을 원하는대로 바꿀 수도 있습니다.
  • QuerySet이 만들어졌으니 장고 기능을 이용해 SQL구문을 몰라도 원하는 데이터를 가져올 수 있습니다. 이제 파이썬과 데이터베이스를 연결해주는 장고 ORM을 사용할 수 있습니다.

 


2. queryset 검색 방법

queryset을 활용해 많이 쓰이는 함수를 정리해 보겠습니다. 같은 결과값을 찾는 SQL query도 함께 표시했습니다.

 

2.1 검색 (결과가 2개 이상 될 수 있음)

 

all

  • Person.objects.all()
    queryset 전체를 불러옵니다.
>>> Person.objects.all()
<QuerySet [<Person: 홍길동>]>
  • Person.objects.values()
    queryset 전체를 불러옵니다.
>>> Person.objects.values()
<QuerySet [{'name': '홍길동', 'gender': 'male', 'age': 15}, {'name': '신사임당', 'gender': 'female', 'age': 35}]>

 

  • SQL query
select *
from Person;

 

filters

  • Person.objects.filter(name='홍길동')
  • Person.objects.filter(id=1)
    해당되는 값을 모두 불러옵니다. 데이터가 저장되면 django 데이터베이스는 식별을 위한 id를 자동으로 부여합니다. (1부터 시작)
- SQL query
select *
from Person
where name='홍길동';

 

  • Person.objects.exclude(name='홍길동')
  • Person.objects.exclude(id=1)
    괄호 안의 값을 제외하고 불러옵니다.
- SQL query
select *
from Person
where name!='홍길동';

 

queryset의 특징들

  • Person.filter(name='신사임당').exclude('male')
    chaining filter가 가능합니다.
  • 불러오는 결과는 복사본으로 변수에 할당해 사용할 수 있습니다.
  • 실제 호출될 때만 실행합니다 아래에서 마지막 줄만 실행됩니다.
    - a = Person.filter(name='신사임당')
    • b = Person.exclude('male')
    • print(b)

 

2.2 검색 (1개의 결과만 호출)

 

get

  • Person.objects.get(name='홍길동')
    get은 값 1개만 불러옵니다. filter와 다른 점은 값이 없을 때 filter는 빈 쿼리셑을 불러 오고 get은 DoesNotExist라는 메시지를 띄웁니다. 그리고 해당하는 값이 한 개가 아닐 경우에는 MultipleObjectsReturned라는 메시지를 띄웁니다. get은 쿼리셑을 호출하는 것이 아니라서 뒤에 다른 메소드를 추가할 수 없습니다.

 

  • SQL query
select *
from Person;
profile
Back-End Developer

2개의 댓글

comment-user-thumbnail
2020년 3월 12일

queryset.filter(search__icontains=query.strip()) 으로 "eTHRIVE 20MIN SENSE" 를 검색 하는데
"SENS"로는 정확하게 검색이 되는데 "SENSE"로는 검색결과가 없는 걸로 나옵니다.

이것뿐만 아니라 다른 몇몇 결과도 그런식으로 나오는데 이유와 해결 방법을 알 수 있을까요?

1개의 답글