a = {'a':'name'}
a['a'] = b
print(b)
>>> name
포장하다 담다라는 의미로 파이썬에서는 패킹을 뜻하는것이 두가지있는데 하나는 위치인자를 나타네는 ‘*’ 키워드인자를 나타네는 ‘**’ 으로 나타내는데
*는 여러개의 값을 동시에 받을수 있으며 이를 튜플로 반환한다.
**는 키값으로 인자들을 받을 수 있으며 이를 딕셔너리로 반환한다.
** 에 인자를 넣는방법은 key=value로
def kwargs(**kwargs):
print(kwargs)
kwargs(a=1, b=2, c=3)
>>> {'a':1, 'b':2, 'c':3}
위와 같은 형태로 패킹이 된다.
패킹의 반대말로
# django/views.py
127.0.0.1:8000/product?theme_id=1&is_new=1
# request로 query parametar를 통해 들어온다고 가정했을때.
filter_set = {}
if theme_id:
filter_set["product__theme_id"] = theme_id
# theme_id 에 1이 들어가고 동시에 filter_set 딕셔너리형태로 저장된다.
# filter_set = {"product__theme_id" : 1}
if search:
filter_set["name__contains"] = search
if is_new:
filter_set["is_new"] = is_new
# theme_id와 마찬가지로
# filter_set = {"product__theme_id" : 1, 'is_new' : 1}
products = Product.objects.filter(**filter_set)
# 딕셔너리를 **키워드 파라미터의 형식으로 인자를 받게되면 언패킹되며
# products = Product.objects.filter("product__theme_id" = 1, 'is_new' = 1)
django에 쿼리파라미터로 언패킹을 사용하면 if문으로 분기하기 쉽다.
추가로 미리 키워드를 정의해놓고 .items 메소드를 이용한다면 if문을 줄일수 있다.
# django/views.py
127.0.0.1:8000/product?theme_id=1&is_new=1&sort=price
# request로 query parametar를 통해 들어온다고 가정했을때.
sort = request.GET.get('sort', '-id')
filter_set = {
"theme_id" : "product__theme_id",
"search" : "name__contains",
"is_new" : "is_new"
}
filter = {
filter_set[key] : value for key, value in request.GET.items()if filter_set.get(key)
}
# request.GET.items() = [(theme_id,1),(is_new,1)] --> items 메소드는 key,value를 튜플로 만들어준다
# filter = {filter_set[theme_id] = 1, filter_set[is_new] = 1}
# filter = {"product__theme_id":1, "is_new":1}
products = Product.objects.filter(**filter).order_by(sort)
# products = Product.objects.filter("product__theme_id"=1, "is_new"=1).order_by(price)