본문 바로가기
airbnb clone coding

[Django] 7_1. ORM Query Sets: filter, get, create, delete

by busybee-busylife 2024. 7. 13.
728x90

ORM (Object-Relational Mapping)
데이터베이스와 상호 작용할 때 SQL을 직접 사용하지 않고 Python 객체로 데이터베이스 작업을 수행할 수 있다

 

Query Set

Query Sets allow you to chain operations together. 

Django ORM에서 데이터베이스로부터 데이터를 가져오고, 필터링하고, 정렬하는 등의 작업을 수행하는 데 사용

데이터베이스의 레코드 목록을 표현하며, SQL 쿼리와 유사한 방식으로 작업할 수 있다

https://docs.djangoproject.com/en/5.0/ref/models/querysets/#

 

 

Django는 나와 데이터베이스가 파이썬 코드를 통해 소통하도록 한다 

모델은 데이터베이스를 들여다보는 '창(window)'의 역할을 하기도 

 

admin 패널 없이 코드만으로 데이터베이스에 접근하기(터미널에서)

1) python manage.py shell : django가 있는 python console을 제공 

2) from rooms.models import Room : 데이터베이스의 Room 모델에 접근한다 

3) Room.objects.all() : 모든 Room 데이터를 출력한다 

4) Room.objects.get(name="Beautiful House"): 이름이 "Beautiful House"인 데이터를 출력한다 

5) room_1 = Room.objects.get(name="Beautiful House"): 이름이 "Beautiful House"인 room을 room_1 이라고 한다 

6) room_1의 여러가지 속성들을 확인할 수 있다 

7) room_1.price = 20

    room_1.save()

    room_1의 가격을 수정

>>> from rooms.models import Room

>>> Room.objects.all()
<QuerySet [<Room: Beautiful House>]>

>>> Room.objects.get(name="Beautiful House")
<Room: Beautiful House>

>>> room_1 = Room.objects.get(name="Beautiful House")

>>> room_1.pk
1   

>>> room_1.id
1   

>>> room_1.name
'Beautiful House'

>>> room_1.owner
<User: busybee>

>>> room_1.amenities.all()
<QuerySet [<Amenity: shower>, <Amenity: Cooking basics>]>

>>> room_1.price   
10  

>>> room_1.price = 20

>>> room_1.price
20  

>>> room_1.save()

 

 

Object = Manager

내가 데이터베이스와 소통할 수 있게 도와준다 

Django 애플리케이션의 모든 모델에는 최소 1개 이상의 Manager가 존재 

(내가 모델을 만들면 저절로 Manager가 함께 만들어진다 by default) 

model.Manager()

Manager는 인터페이스(데이터베이스 쿼리 연산자를 통해 django 모델에게 제공되는)

내가 데이터베이스와 소통할 수 있게 도와준다 

 

 

.all()

 

 

.get()

: 한번에 하나의 데이터(요소)만 반환

데이터가 여러개 or 없는 조건을 넣으면 에러발생

ex. Room.objects.get(pet_friendly=True)

pet_friendly=True인 room이 여러개 있으면 에러메세지 

 

 

.filter()

>>> from rooms.models import Room

>>> Room.objects.get(pk=1)
<Room: Beautiful House>

>>> Room.objects.filter(pet_friendly=True)
<QuerySet [<Room: Beautiful House>]>

>>> Room.objects.filter(price__gt=10)
<QuerySet [<Room: Beautiful House>]>

>>> Room.objects.filter(name__contains="beautiful")
<QuerySet [<Room: Beautiful House>]>

>>> Room.objects.filter(name__startswith="beautiful")
<QuerySet [<Room: Beautiful House>]>

>>> Room.objects.filter(created_at__year=2024)
<QuerySet [<Room: Beautiful House>]>
>>> Room.objects.filter(pet_friendly=True, name__contains="Beautiful", price__gt=10)
<QuerySet [<Room: Beautiful House>]>

>>> Room.objects.filter(pet_friendly=True, name__contains="Beautiful", price__gt=10).count()
1

여러 조건을 동시에 사용할 수 있다 

 

 

.create() / .delete()

>>> from rooms.models import Amenity

>>> Amenity.objects.all()
<QuerySet [<Amenity: shower>, <Amenity: Cooking basics>, <Amenity: Private Entrance>, <Amenity: Backyard>]>

>>> Amenity.objects.create(name="Coffee machine", description="free capsule")
<Amenity: Coffee machine>

>>> to_delete = Amenity.objects.get(pk=5)
>>> to_delete
<Amenity: Coffee machine>

>>> to_delete.delete()
(1, {'rooms.Amenity': 1})

 

728x90