반응형
python manage.py shell
파이썬 쉘에서
+----+---------------+---------+
| id | name | menu_id |
+----+---------------+---------+
| 1 | 콜드 브루 | 1 |
| 2 | 블랜디드 | 1 |
| 3 | 브레드 | 2 |
| 4 | 케이크 | 2 |
+----+---------------+---------+
+----+---------------+---------+
| id | name | menu_id |
+----+---------------+---------+
| 1 | 콜드 브루 | 1 |
| 2 | 블랜디드 | 1 |
| 4 | 브레드 | 2 |
| 5 | 케이크 | 2 |
+----+---------------+---------+
위 데이터를 아래처럼 바꿀거다.
(id값 3, 4번 데이터를 -> 4, 5번으로 바꾸기)
1번시도: 변수에 넣고 값 변경후 저장(실패)
>>> c=Category.objects.get(pk=4)
>>> c.id=5
>>> c.save()
변수 c에 4번 id=4 데이터를 넣었다
그러면 c에는 id=4, name="케이크", menu_id=2 인
<Category: Category object (4)>가 들어있다.
여기서 c.id=5를 하면
c의 데이터는 id=5, name="케이크", menu_id=2 이다.
여기서 c.save()를 해버리면
그냥 id=5자리에 name="케이크", menu_id=2인 데이터가 들어가버린다
mysql> select * from categories;
+----+---------------+---------+
| id | name | menu_id |
+----+---------------+---------+
| 1 | 콜드 브루 | 1 |
| 2 | 블랜디드 | 1 |
| 3 | 브레드 | 2 |
| 4 | 케이크 | 2 |
| 5 | 케이크 | 2 |
+----+---------------+---------+
5 rows in set (0.00 sec)
그래서 이렇게 같은 데이터가 4번과 5번에 중복으로 생겼다.
그래서 4번을 삭제해서
>>> c=Category.objects.get(pk=4)
>>> c.delete()
(1, {'products.Category': 1})
결과적으로는 4->5로 옮기긴 했지만 맞는 방법이 아니기 때문에 3->4는 다시 찾아보고 update를 사용했다.
2번: update사용
2-1 get.update 했다가 실패
>>> Category.objects.get(id=3).update(id=4)
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'Category' object has no attribute 'update'
update는 Category.objects.update이렇게 바로쓰는것이 아니고 쿼리셋을 먼저 불러온다음에 그 쿼리셋에 대해서 사용가능하다.
get은 쿼리셋을 불러오는게 아니고 데이터 객체 하나만 가져온다.
update->get이랑 같이 쓰면 안되고 filter만 가능
Category.objects.filter(조건).update
2-2 pk를 업데이트하다가 실패
>>> Category.objects.filter(pk=3).update(pk=4)
Traceback (most recent call last):
File "/Users//miniconda3/envs/westarbucks/lib/python3.9/site-packages/django/db/models/options.py", line 672, in get_field
return self.fields_map[field_name]
KeyError: 'pk'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users//miniconda3/envs/westarbucks/lib/python3.9/site-packages/django/db/models/query.py", line 861, in update
query.add_update_values(kwargs)
File "/Users//miniconda3/envs/westarbucks/lib/python3.9/site-packages/django/db/models/sql/subqueries.py", line 88, in add_update_values
field = self.get_meta().get_field(name)
File "/Users//miniconda3/envs/westarbucks/lib/python3.9/site-packages/django/db/models/options.py", line 674, in get_field
raise FieldDoesNotExist(
django.core.exceptions.FieldDoesNotExist: Category has no field named 'pk'
Category.objects.filter(pk=3)까지는 된다
>>> Category.objects.filter(pk=3)
<QuerySet [<Category: Category object (3)>]>
update를 pk=4로 하는 것은 안된다
필드명을 넣고 업데이트해야되는데 필드명은id기때문에..
이름이 id인 필드가 pk로지정된것이다 그래서 업데이트는 id=4로해야된다
2-3 성공..
>>> Category.objects.filter(pk=3).update(id=4)
1
데이터 하나가 변경됐다는 결과가 나오고
mysql> select * from categories;
+----+---------------+---------+
| id | name | menu_id |
+----+---------------+---------+
| 1 | 콜드 브루 | 1 |
| 2 | 블랜디드 | 1 |
| 4 | 브레드 | 2 |
| 5 | 케이크 | 2 |
+----+---------------+---------+
4 rows in set (0.00 sec)
이렇게 원래 id가 3이던 데이터의 id값이 4로 바뀌었다!
반응형
'Django' 카테고리의 다른 글
| Django | models : verbose_name (0) | 2022.08.20 |
|---|---|
| Django | ORM : on_delete=models.CASCADE (0) | 2022.08.14 |
| Django | 프로젝트 초기세팅 (0) | 2022.07.16 |
| Django | 다대다(many-to-many) 관계 만들기 (0) | 2022.07.05 |
| Django | sql - 장고 모델 속성의 데이터타입 (0) | 2022.07.05 |