일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- TIL #Today I Learned #
- javascript '===' #javascript #TIL #Today I Learned #기록 #회고
- 자바스크립트 #javascript #datatype #데이터타입 #자료형
- 블로그 셀프제작
- single source of truth란 #single source of truth #자료의중복 #자료의비정합성 #비정합성 #리팩토링
- #TIL #Today I Learned #기록 #회고 #ternary statement #swich statement #스위치 반복문 #
- 고스트 블로그 #
- javascript #event #onclick #js
- 웹페이지제작 #
- javascript #statement #expression #difference
- 블로그만들기 #웹사이트만들기 #
- TIL #Today I Learned # 기록 # 회고 #Udemy
- Hackerrank #해커랭크 #python #파이썬 #알고리즘 #Algorithm
- hackerrank #python #algorithm #해커랭크 #파이썬 #알고리즘
- 불리언 #Boolean #number #string #symbol #null #undefined
- 기록 #회고
- 강의 #느낀점 #snowfox #스노우폭스 #김승호회장
- Today
- Total
well-balanced
[Django Tutorial] choice_set란? (Related objects) 본문
오역이 있을 수 있습니다.
사건은 Django 튜토리얼 진행 도중에 발생했다.
Tutorial를 따라가면서 Shell을 통해 모델을 제어하고 있는 도중 choice_set
이 갑툭튀. 이상하다 난 저런 메소드를 구현한 적이 없는데.. 그래도 혹시 모르니 models.py
파일을 다시 확인해봤으나 역시 없다.
처음에는 내장 메소드인줄 알고 문서에서 찾아봤지만 없었고, 좀 찾아보니 이곳에서 이유를 알아낼 수 있었다.
Related objects¶
When you define a relationship in a model (i.e., a ForeignKey, OneToOneField, or ManyToManyField), instances of that model will have a convenient API to access the related object(s).
Using the models at the top of this page, for example, an Entry object e can get its associated Blog object by accessing the blog attribute: e.blog.
(Behind the scenes, this functionality is implemented by Python descriptors. This shouldn’t really matter to you, but we point it out here for the curious.)
Django also creates API accessors for the “other” side of the relationship – the link from the related model to the model that defines the relationship. For example, a Blog object b has access to a list of all related Entry objects via the entry_set attribute: b.entry_set.all().
All examples in this section use the sample Blog, Author and Entry models defined at the top of this page.
그리고 조금 더 내려보니 이런 말도 있다.
By default, this Manager is named FOO_set, where FOO is the source model name, lowercased.
기본적으로 객체에 접근할 수 있는 매니저의 이름은 모델명(소문자)_set
으로 지어진다고 한다.
부족한 영어 실력이지만, 이해를 돕는다면 ForeignKey
로 어떠한 모델 A
를 참조하고 있는 모델 B
는 그 모델 A
에 접근할 때 미리 ForeignKey
로 지정해두었던 변수를 통해 접근할 수 있고, 참조되고 있는 모델 B
는 모델 A
에 접근할 때 모델명_set
의 형태로 접근한다.
내가 진행 중이던 프로젝트를 예로 들어보자면
# models.py
class Question(models.Model):
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days = 1)
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
def __str__(self):
return self.choice_text
question = models.ForeignKey(Question, on_delete = models.CASCADE)
choice_text = models.CharField(max_length = 200)
votes = models.IntegerField(default = 0)
Question
이라는 모델이 있고 Choice
라는 모델이 있다. Choice
의 column이 될 question
이라는 변수는 Question
모델을 ForeignKey
로써 참조하고 있다. 먼저 Question
모델에서 Choice
모델의 값에 접근해보자.
Question.objects.get(pk=1) // Question 모델에서 pk 값이 1인 row를 가져온다.
<Question: What's up?>
q = Question.objects.get(pk=1)
q.choice_set.all() // 자신을 참조하는 모델이름을 lowercase_set을 이용해 접근한다.
<QuerySet []>
q.choice_set.create(choice_text='Not much', votes=0) // Choice 모델에 row를 생성
<Choice: Not much>
그럼 이제 반대로 Choice
모델에서 Question
모델의 값에 접근해보자.
c = Choice.objects.get(pk=1) // pk=1인 Choice row를 가져온다.
c
<Choice: Not much>
c.question // 미리 ForeignKey로 정해둔 변수를 통해 Question 모델에 접근한다.
<Question: What's up?>
c.question.question_text
"What's up?"
아직 개발 초보단계인 내 입장에서 보자면 Django 공식 튜토리얼 안에서 이에 대한 설명이 너무 부족하지 않았나 라는 생각이 든다. 그래도 이렇게 또 하나하나 찾아보면서 배웠으니 머릿속으로 잘 간직할 수 있을 것 같다.
'Python' 카테고리의 다른 글
[Django tutorial] 장고 테스트 자동화 (0) | 2020.02.01 |
---|---|
[Django tutorial] 하드코딩된 URL 개선 (0) | 2020.01.31 |
[python] tkinter와 random 모듈을 이용한 이미지 만들기 (0) | 2019.03.03 |
[python]Window 가상환경 구축 django 설치 (0) | 2019.02.25 |
[python] 미니 프로그램 만들기 (달에서의 몸무게) (0) | 2018.12.25 |