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
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' 카테고리의 다른 글
[Django] 클래스형 뷰와 제네릭 뷰 소개 (0) | 2023.01.24 |
---|---|
[Django] 템플릿 시스템 (0) | 2023.01.24 |
[Django] Admin 사이트 커스터마이징 (0) | 2023.01.22 |
[Django] 정적 파일 및 미디어 파일 처리 (0) | 2021.08.09 |
[Django] Admin 기초 / 동적 URL / views 기초 (0) | 2021.08.09 |
댓글