inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

instagram 앱 생성과 포스팅 쓰기 구현

공식 문서에서 get_or_create 관련 궁금한 점이 있습니다.

246

뤀쪼

작성한 질문수 18

0

안녕하세요 강사님.
다음은 get_or_create 관련 공식 문서의 예제?입니다.

class
Chapter(models.Model): title = models.CharField(max_length=255, unique=True) class Book(models.Model): title = models.CharField(max_length=256) chapters = models.ManyToManyField(Chapter)

You can use get_or_create() through Book’s chapters field, but it only fetches inside the context of that book:

>>> book = Book.objects.create(title="Ulysses")
>>> book.chapters.get_or_create(title="Telemachus")
(<Chapter: Telemachus>, True)
>>> book.chapters.get_or_create(title="Telemachus")
(<Chapter: Telemachus>, False)
>>> Chapter.objects.create(title="Chapter 1")
<Chapter: Chapter 1>
>>> book.chapters.get_or_create(title="Chapter 1")
# Raises IntegrityError

해당 부분에서 마지막에 IntegrityError가 발생하는데 이부분은
class Chapter의 title이 unique=True로 지정되어 있으나,
위에서 Chapter.objects.create(title="Chapter 1")를 진행해줘서 발생한 에러인가요?

그렇다면 unique=True를 없애준다면, (<Chapter: Chapter 1>, False)을 반환하리라 기대해도 좋을까요?

강사님 때문에 코딩이 재밌습니다ㅎㅎ 미래는 불투명하지만 화이팅하겠습니다!

 

docker react python django

답변 2

0

이진석

그리고, 장고 settings에 다음 로깅 설정을 추가하시고 장고 쉘을 다시 여시면, 각 ORM 코드 실행마다 수행되는 SQL 내역이 출력이 됩니다. 그럼 각 ORM 동작을 이해하시는 데에 큰 도움이 됩니다. // 저도 이 설정을 추가하여 질문주신 내용을 보다 정확하게 파악할 수 있었습니다.

단, 위 코드는 DEBUG=True 시에만 동작시켜주세요.

화이팅입니다. :D

0

이진석

안녕하세요.

1단계) Chapter.objects.create(title="Chapter 1") 코드를 통해 book 지정이 없이 Chapter가 생성이 된 상태이구요.

2단계) book.chapters.get_or_create(title="Chapter 1") 코드는
- book을 가지면서 title="Chapter 1" 인 Chapter를 찾아보고 (get 동작) 없으면 생성 (create 동작) 합니다.
- book을 가지면서 title="Chapter 1"인 Chapter는 현재 없습니다. 1단계의 코드는 book 지정이 없으니까 위 Row는 get 동작에서는 무시되는 거죠. 그래서 book도 지정하고 title="Chapter 1"인 Row를 생성할려고 DB에 insert 쿼리를 던졌는 데, title 필드가 unique=True 여서 title="Capter 1"이 중복이여서 오류가 발생하는 상황입니다.

그런데 Chapter 모델에서는 title 필드에 대해 unique=True 제약사항이 꼭 필요해보입니다. 그러니 ManyToManyField 에서는 아래와 같이 써보세요.

# Chapter에 대해 get_or_create를 해주시고
chapter, is_created = Chapter.objects.get_or_create(title="Chapter 1")
# M2M 필드에 대해서는 다음과 같이 add를 해주세요. add는 여러번 수행되더라도 관계를 1회만 저장됩니다.
book.chapters.add(chapter)

코딩에 재미를 느껴주셔서 감사해요. 화이팅입니다. :-)

안녕하세요.

0

62

1

[OneToOne Field Demo] get_user_model() 메서드를 활용해야 하는 이유?

0

285

1

useEffect 훅에서 else 유무에 따른 결과

0

222

1

useAxios 훅의 dependency array 설정

0

254

1

useEffect에서 변수 업데이트 관련 질문

0

389

1

rest_framework.generics.CreateAPIView의 model 속성 유무

0

276

1

bootstrap4

0

481

4

리뉴얼 강의가 오픈이 되면 기존 강의는 더이상 못보는걸까요

1

374

1

admin form에서 앞선 필드 선택 후 다른 필드 select widget 구성하는 방법

0

578

3

useState는 필수일까요?

0

272

1

python manage.py makemigrations instagram 시 created_at default 오류가 발생합니다.

0

611

4

Django allauth를 사용한 소셜 로그인 시 에러

0

660

1

프로젝트명 변경 뒤, 디버그툴바+디버그모드 사용 시 에러

0

569

2

useLocalStorage() 함수 사용여부

0

238

1

django에 LOGIN_URL = '/accounts/login/'의 의미?

0

454

1

리듀서의 의미 재확인

0

439

1

simple-jwt Refresh Token 사용 노하우

0

907

2

docker compose 를 통한 배포 관련 오류 문의

0

686

1

파이썬 속도 장고 관련 궁금한게 있습니다.

0

372

1

is_like_user

0

238

1

related_name 오류

0

278

1

re_path 오류

0

265

1

re_path url

0

255

1

No post matches the given query

0

671

2