django shell 에서 스타벅스 과제하다가 string 을 변수로 바꾸고 싶어졌다. 일 대 다 관계에서 다 에 위치하는 instance 를 생성할 때는 참조하는 대상이 필요하다. 그래서 참조하는 테이블의 instance 를 만들어주고 변수에 저장할 필요가 있는데, 카테고리 9 개에 변수를 일일이 지정해주려고 하니까 귀찮고 오래걸리고 분명히 더 나은 방법이 있을 것 같았다. 그리고 장고 쉘이 불안정한지 계속 팅기는데, 팅길때 마다 변수를 지정해줘야해서 열불이 났다.💢
string 에서 변수로 바꿔주면 더 빨리 처리가 가능한 작업인데, 찾아보니 역시 있었고 간단했다. 찾아보느라 시간이 더 걸린셈이 됐지만, 담에 써먹어도 되니까!
그리고 사용자에게 input 을 받은 값을 변수로 이용하는데 써먹을 수도 있다.
우선 다음의 작업을 한번에 하고 싶었다.
[coldbrew, espresso, ..., bottled] = Category.objects.all()
뒷 부분 코드의 결과가 QuerySet 으로 반환된다. list 와 비슷한 장고 자료구조다.
물론 저것도 많이 느리진 않지만 string 으로 한번에 변수로 지정할 순 없는지 궁금해졌다.
nameCat = "coldbrew-espresso-...-bottled".split("-")
nameCat 은 string 을 담은 리스트가 되는데, 여기서 각 string 을 변수로 바꿔서 각 QuerySet 객체를 담고 싶었다.
방법은 globals() 를 이용하면 된다.
globals() 는 python 내장 함수로, 정의된 global varibale 들을 dictionary에 담아서 보여준다.
예를 들어서, python shell 을 켜서 첫 줄에 a = 1 이라고 치고 globals() 를 호출하면, python 에서 자체적으로 미리 선언된 변수들과 함께 'a' 를 key 로 가지고 1 을 value 로 가지는 dictionary 를 보여준다.
a = 1
globals()
#output
{
'__name__': '__main__',
...,
'a': 1,
}
즉, gloabls() 가 반환한 dictionay 에서는 변수 이름이 key, 변수가 담고 있는 것(변수에 저장 가능한 어떠한 것도)이 value 로 저장된다.
이 성질을 이용해서 각 string 을 key 로 넣고 QuerySet 객체들을 value 로 넣으면 된다.
nameCat = "coldbrew-espresso-...-bottled".split("-")
categorySet = Category.objects.all()
for i in range(len(nameCat)):
globals()[nameCat[i]] = categorySet[i]
coldbrew
# output 은 <QuerySet "콜 드 브 루">, 설정해놓은 __str__ 값에 따라 달라지겠죠?!
큰 개선은 아니지만 string 을 variable 로 바꾸는 방법을 알게되서 만족한다. 🤗
메리 크리스마스 😁😁
쉘은 이제 제대로 되시나요? ㅋㅋㅋㅋㅋ