Django | 파이썬 쉘에서 db에 있는 데이터 id값 바꾸기

2022. 7. 6. 23:45·Django
반응형
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
'Django' 카테고리의 다른 글
  • Django | ORM : on_delete=models.CASCADE
  • Django | 프로젝트 초기세팅
  • Django | 다대다(many-to-many) 관계 만들기
  • Django | sql - 장고 모델 속성의 데이터타입
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
Django | 파이썬 쉘에서 db에 있는 데이터 id값 바꾸기
상단으로

티스토리툴바