관리 메뉴

프로그래밍

[DRF] QueryDict과 Class Dict(feat. HTTP 메서드) 본문

Python/Django REST Framework

[DRF] QueryDict과 Class Dict(feat. HTTP 메서드)

시케 2024. 12. 18. 14:51
728x90
반응형

2024.12.17.화

Dictionary?

이름을 얼핏 들으면 "둘 다 같은 딕셔너리 아닌가?" 라고 생각할 수 있다

다만 둘의 사용 맥락과 특징은 다르니

특히 REST API를 사용하는 DRF에서는 차이점을 알아두는 것이 좋다

 

Class Dict

일반적인 Python의 dict 객체이다

key-value 쌍으로 데이터를 저장한다

  값에 리스트를 명시적으로 지정하지 않으면 단일 값만 저장한다(여러 값을 저장하려면 수동으로 리스트를 생성 )

 

사용 맥락

 

  • Django 모델에서 데이터를 다룰 때, 모델 인스턴스의 __dict__ 속성을 통해 필드 값에 접근 가능
  • Python 전반에서 데이터 저장, 처리 등에 사용

 

더보기

__dict__란?

 

  • Python 객체의 __dict__는 객체의 속성을 저장하는 사전(dict)이다
  • 객체가 가진 모든 속성과 그 값들을 key-value 쌍으로 저장함
  • 일반적으로 사용자 정의 클래스나 Django 모델에서도 이 속성이 존재하며, 객체 내부 데이터를 확인하거나 조작할 때 사용 가능 함

 

 

 

특징

  • 변경 가능: 자유롭게 값을 추가, 삭제, 수정 가능
  • 직접 접근 가능: 키를 통해 데이터를 바로 접근하거나 수정 가능

예제

# 일반 dict 예제
data = {"key1": "value1", "key2": "value2"}
print(data["key1"])		# 출력: value1
data["key3"] = "value3"		# 값 추가

Query Dict

Django에서 사용되는 특별한 dict 형태이다

HTTP 요청(request)의 데이터를 다룰 때 주로 사용한다

QueryDict는 내부적으로 MultiValueDict 구조를 사용하여 키에 여러 값을 리스트 형태로 저장

출력 시 QueryDict 객체라는 정보와 함께 각 키에 대해 항상 리스트 형태로 값이 저장되어 있는 것을 알 수 있다

※ Django의 QueryDict 클래스는 django.http.QueryDict에 정의되어 있음

 

사용 맥락

 

  • request.GET 또는 request.POST와 같은 요청 데이터를 처리할 때 사용
  • 주로 웹 폼 데이터URL 쿼리 매개변수를 다룰 때 사용

특징

 

  • Immutable (읽기 전용): 기본적으로 변경 불가하며 데이터를 수정하려면 mutable 속성True로 설정해야 함
  • 다중 값 지원: 하나의 키에 대해 여러 값을 저장 가능 이를 위해 getlist() 메서드를 제공

예제

from django.http import QueryDict

# QueryDict 예제
qd = QueryDict("key1=value1&key2=value2&key1=value3")
print(qd["key1"])       # 출력: value1 (첫 번째 값 반환)
print(qd.getlist("key1"))  # 출력: ['value1', 'value3'] (모든 값 반환)

# 데이터를 수정하려면 mutable 속성 사용
qd = qd.copy()  # 기존 QueryDict는 immutable이므로 복사본 생성
qd["key3"] = "value4"
print(qd)  # 출력: QueryDict('key1=value1&key1=value3&key2=value2&key3=value4')

 

 

사용 예제

# QueryDict의 단일 값 접근
print(query_dict.get('key1'))  # 'value1' (첫 번째 값 반환)
print(query_dict.get('key2'))  # 'value2' (첫 번째 값 반환)

# Python Dictionary의 값 접근
print(python_dict['key1'])  # 'value1'
print(python_dict['key2'])  # ['value2', 'value3'] (리스트 전체 반환)
QueryDict 출력:
<QueryDict: {'key1': ['value1'], 'key2': ['value2', 'value3']}>
QueryDict 내부 구조 (getlist 사용):
['value2', 'value3']

Python Dictionary 출력:
{'key1': 'value1', 'key2': ['value2', 'value3']}

 

필요한 경우 QueryDict ↔ Class Dict을 양방향으로 변환 가능하다

 

QueryDict → Class Dict 변환

data = dict(request.GET) # 딕셔너리로 변환

# 딕셔너리로 복사하는 방식으로도 활용 가능
data = request.data.copy()

 

Class Dict → QueryDict 변환

from django.http import QueryDict

qd = QueryDict('', mutable=True)
qd.update({"key1": "value1", "key2": "value2"})

 

728x90
반응형
Comments