본문 바로가기
  • 실행력이 모든걸 결정한다
Django

[Django] 장고 파이썬 쉘 / Model CRUD API

by 김코더 김주역 2023. 1. 24.
반응형

1. 장고 파이썬 쉘

- 간단한 데이터를 관리하거나 UI에서 데이터를 확인하고 싶다면 Admin 사이트를 이용하고, 복잡한 데이터를 관리하는 경우에는 쉘을 이용한다. 이번 포스팅에서는 쉘을 이용하는 방법을 소개할 것이다.

- 장고 파이썬 쉘은 다음과 같은 명령어로 실행하면 된다. manage.py에서 정의한 DJANGO_SETTINGS_MODULE 속성을 이용하여 mysite/settings.py 모듈을 미리 임포트 해준다.

python manage.py shell

 

 

 

2. Model CRUD API

1) Create

- 테이블에 레코드를 생성하기 위해서는 모델 객체의 save() 메소드를 호출하면 된다. 내부적으로 INSERT문이 실행된다.

q=Question(question_text="What's new?", pub_date=timezone.now())
q.save()

- 또한, 외래키로 연결되어 있는 N:1 관계에서 N쪽 객체를 생성해서 데이터베이스에 저장하려면, 다음과 같이 1쪽 모델 클래스에 제공되는 [N쪽 모델 클래스의 소문자명]_set의 create(**kwargs) 메소드를 이용하면 된다. 연관 관계는 이미 맺어졌기 때문에 create() 메소드에 외래키 인자는 넣지 않는다.

# Question, Choice는 1:N 관계
q=Question.objects.get(pk=1)
q.choice_set.create(choice_text='Apple', votes=0)
q.choice_set.create(choice_text='Banana', votes=0)
c=q.choice_set.create(choice_text='Mango', votes=0) # Choice 객체를 반환받을 수도 있음

참고로, add() 메소드를 통해 객체 자체를 추가하는 방법도 있다.

q.choice_set.add(Choice 객체)

 

 

2) Read

- 테이블로부터 가져온 객체들의 집합은 QuerySet 객체다. 데이터를 조회할 때는 내부적으로 SELECT문이 실행된다.

- QuerySet의 필터를 통해 QuerySet 내의 항목 중에서 조건에 맞는 레코드만 다시 추출할 수도 있다. 이 때는 내부적으로 WHERE문이 실행된다.

- 모델 클래스의 objects 객체는 테이블 정보를 담고 있는 객체로, 다음과 같은 메소드들을 사용할 수 있다.

  • objects.all() : 모든 객체를 담은 QuerySet을 반환
  • objects.get() : 주어진 조건에 맞는 한 개의 객체를 반환
  • objects.filter() : 주어진 조건에 맞는 모든 객체를 담은 QuerySet을 변환
  • objects.exclude() : 주어진 조건에 맞지 않는 모든 객체를 담은 QuerySet을 변환
Question.objects.all() # 모든 Question 객체를 담은 QuerySet을 반환
Question.objects.all()[:5] # 1~5번째 객체를 반환
Question.objects.all()[5:10] # 6~10번째 객체를 반환
Question.objects.all()[:10:2] # 1,3,5,7,9번째 객체를 반환

※ ManyToManyField로 정의한 필드나, N:1 관계에서 1쪽 객체가 부여받는 [N쪽 모델 클래스의 소문자명]_set 속성에도 all 메소드를 사용할 수 있다.

※ 1쪽 객체에서 filter() 메소드로 N쪽을 조회할 수도 있다((참고)역방향으로 필터 메소드 사용). 이러한 경우에는 중복 결과가 조회될 수도 있기 때문에, 일반적으로 뒤에 .distinct()를 추가로 붙여준다.

 

- QuerySet 메소드들은 QuerySet을 반환하기 때문에 다음과 같이 체인식 호출이 가능하다.

Question.objects.filter(
	question_text__startswith='What'
).exclude(
	pub_date__gte=datetime.date.today()
).filter(
	pub_date__gte=datetime(2022, 1, 24)
)

※ 위의 예시에서 사용한 __(double underscore)은 필드 룩업 앞에 붙이는 기호다. startswith은 시작 문자열, gte는 이상(크거나 같은)을 의미하는 필드 룩업이다. 더 많은 필드 룩업들을 확인하려면 아래 문서를 참고하자. https://docs.djangoproject.com/en/4.1/ref/models/querysets/#field-lookups

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

 

3) Update

- 이미 존재하는 객체에 대한 필드 속성값을 수정한 후 save() 메소드를 호출하면 된다.

- QuerySet의 update() 메소드를 사용하여 여러 개의 객체를 한꺼번에 업데이트할 수 도 있다.

Question.objects.filter(pub_date__year=2023).update(question_text='How are you?')

 

 

4) Delete

- QuerySet의 delete() 메소드를 사용하여 주어진 조건에 맞는 모든 객체를 삭제할 수 있다.

Question.objects.filter(pub_date__year=2023).delete() # 조건에 맞는 모든 객체 삭제
Question.objects.all().delete() # 모든 객체 삭제

 

 

참고 할만한 자료 - QuerySet API

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#queryset-api

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

반응형

댓글