⭐️Tips. django shell command

yeeun lee·2020년 4월 13일
1

Django

목록 보기
7/8
post-custom-banner

django shell에서 데이터를 저장, 삭제, 수정하고 싶어서 command를 찾아보니까 생각보다 데이터가 안 나왔다. 검색검색을 해보니 이렇게 single data를 다룰 때에는 'record'로 검색을 했어야 되는 거였다 🙄

정리가 잘 되어있는 사이트는 아니지만 참고 사이트도 필요할 때 보면 좋을 것 같다.

게시물을 만들게 된 것은 shell에서 record create를 해보다가 row 하나를 빼먹은게 시작점이었다. 해당 데이터만 추가하기 위한 방법을 우선 보고, 나머지 내용도 알게되면 추가로 정리해보려고 한다 🔥

1. 데이터 생성

CRUD중 가장 쉬운 단계다. obejcts 뒤에 create만 붙여주면 된다. 괄호 안에는 넣어야 하는 record를 입력한다.

Allergy.objects.create(ingredient='우유')
# output: <Allergy: Allergy object (1)>

Allergy.objects.create(ingredient='대두')
# output: <Allergy: Allergy object (2)>

2. 데이터 추가 or 변경

객체의 objects를 update하는 방법을 알아보자. 총 두 가지가 있다. stack overflow에서 조금 찾아보니 save는 single data, update는 multiple data를 저장하는 데에 사용되는 것 같다.

2.1 .save()

객체를 변수에 저장하고, 해당 변수에 원하는 value를 할당한 뒤 저장하는 방식이다.

# nutrition_id 에 데이터를 안 넣은 상태여서, 해당 value가 None인 상태
Product.objects.values()
<QuerySet [{'id': 1, 
    'category_id': 1, 
    'menu_id': 1,
    'nutrition_id': None, 
    'name': '바닐라 크림 콜드 브루'
    }]>
    
# 변수를 만들어 객체 저장
p = Product.objects.get(id=1)

# 객체의 nutrtion_id에 value 1을 할당
p.nutrition_id=1

# 객체 p를 저장 
p.save() 

Product.objects.values()
<QuerySet [{'id': 1,
    'category_id': 1,
    'menu_id': 1, 
    'nutrition_id': 1,
    'name': '바닐라 크림 콜드 브루'}]>

2.2 .update()

쿼리셋에 쓸 수 있는 방법이기 때문에, 여러개의 객체에 한꺼번에 저장할 수 있다. 객체에 filter를 적용했을 때 쿼리셋이 리턴되기 때문에 해당 방법을 적용한다.

# product id=1 객체의 nutrition_id를 다시 None으로 만들기 
Product.objects.filter(id=1).update(nutrition_id=None)

# 위 코드를 실행하면 인터프리터에 1이 뜨는데, 적용이 되었다는 뜻이다.
# nutrition_id가 다시 None값이 된 것을 알 수 있다.
Product.objects.values()
<QuerySet [{'id': 1, 
	'category_id': 1, 
    	'menu_id': 1, 
        'nutrition_id': None, 
        'name': '바닐라 크림 콜드 브루'}]>
        
Product.objects.filter(id=1).update(nutrition_id=1)
#output = 1 잘 적용되었다는 뜻

Product.objects.values()
<QuerySet [{'id': 1,
    'category_id': 1,
    'menu_id': 1, 
    'nutrition_id': 1,
    'name': '바닐라 크림 콜드 브루'}]>

3. 데이터 삭제

데이터를 지우는 방법도 추가, 수정하는 것과 비슷하다. filter를 사용해서 쿼리셋에 Delete method를 쓰거나, instance를 만든 뒤에 바로 해당 변수를 삭제해주는 것이다.

데이터 삭제에서 특이한 점은, 쿼리셋은 지워진 데이터의 쿼리셋 id를 남겨둔다는 것이다. 리스트에서 특정 요소를 지웠을 때 인덱스 번호가 당겨지는 것과 상반된다.

내가 두 번째 쿼리셋을 지우고 3번째 데이터를 추가했을 때, 해당 객체의 objects를 찍어보면 쿼리셋 id 3부터 시작하는 것을 알 수 있다.

Product.objects.create(name='blah')
<Product: Product object (3)
>>> Product.objects.values()
<QuerySet [{'id': 1, 
	'category_id': 1, 
    'menu_id': 1, 
    'nutrition_id': 1, 
    'name': '바닐라 크림 콜드 브루'}, 
    
    {'id': 3, # 1 다음에 추가했음에도 3으로 추가된 것을 볼수 있다! 
    'category_id': None, 
    'menu_id': None, 
    'nutrition_id': None, 
    'name': 'blah'}]>

3.1 .delete()

# id=3인 객체를 지워주세요
Product.objects.filter(id=3).delete()

#
(1, {'drinks.Product': 1})

Product.objects.values()
<QuerySet [{'id': 1, 
	'category_id': 1, 
    	'menu_id': 1, 
        'nutrition_id': 1, 
        'name': '바닐라 크림 콜드 브루'}]>

데이터 추가, 변경과 동일하게 instance를 지우는 방법도 있다.

p = Product.objects.get(id=2)
p.delete()
profile
이사간 블로그: yenilee.github.io
post-custom-banner

0개의 댓글