과제 중 등장한 새로운 개념들을 정리해보았다.
파이썬에서 날짜(Date)는 datetime.date
의 객체로 표현된다.
field_name = DateField()
#오늘 날짜를 저장
datetime.date.today()
#괄호 안의 숫자를 날짜로 저장
datetime.date(2021,7,20)
영화의 개봉날짜를 저장하기 위해서 사용했다.
a = Movie(title = '기생충',
release_date = datetime.date(2019,5,30)
running_time = 132)
a.save()
field_name = ManyToManyField(object)
장고가 ManyToManyField
를 인식하고 다대다 관계의 테이블 사이에 중간 테이블을 생성해준다. 이 필드값은 FK로 참조하는 테이블이 갖는다. (*topping -> pizza)
ForeignKey
와 동일하게 작동한다.
ForeignKey
나 ManyToManyField
를 갖는 1대1 혹은 다대다 관계의 테이블 사이의 데이터는 참조, 역참조를 사용해서 현재 테이블의 객체에서 다른 테이블의 객체를 호출할 수 있다.
역참조를 이용한 호출 방법 두가지를 소개한다.
_set
참고 : 참조 방향 ( actor -> movie )
#역참조
movie.actor_set.all()
#참조
actor.movies.all()
역참조 키값은 기본으로 클래스 이름을 소문자로 한 문자열이다. 위의 예시에서는 'actor'이 해당한다.
models.py
에서 field값을 정의할 때 ForeignKey와 ManyToManyField에 related_name
을 설정할 수 있다. 설정한 값은 역참조 키값이 된다.
#related_name = actors
movie.actors.all()
1번의 movie.actor_set.all()과 같다. 단지, actor_set이 actors 로 정의된 것 뿐이다.
역참조를 이용해서 상호관계가 있는 데이터를 생성, 추가, 삭제 할 수 있다.
a = Movie.objects.get(title='부산행')
b = Actor.objects.get(name ='정유미')
a.actor_set.add(a)
DB로 save하는 과정은 필요없으며 이미 존재하는 객체 사이에 관계를 생성한다.
a = Movie.objects.get(title='부산행')
b = a.actor_set.create(name='정유미', ..)
#혹은
a = Movie.objects.get(title='부산행')
b = Actor(name='정유미',... ,movie=a)
b.save()
movie는 Actor 클래스가 갖는 Movie클래스에 대한 ManyToManyField 값이다.
a = Movie.objects.get(title='부산행')
b = Actor.objects.get(name='정유미')
a.actor_set.remove(b)