하나의 모델이 다른 여러 모델과 관꼐를 가질 수 있고, 이것의 반대(역)도 가능한 관계
예시로 영화와 배우 관계로 나타내보겠습니다.
models.py
1 from django.db import models
2 from django.db.models.deletion import CASCADE
3
4 # Create your models here.
5
6 class Actor(models.Model):
7 first_name = models.CharField(max_length=45)
8 last_name = models.CharField(max_length=45)
9 date_of_birth = models.DateField(auto_now=False, null=Tr ue)
10 movies = models.ManyToManyField('Movie', through='Actor_ Movie')
11 class Meta:
12 db_table="actors"
13
14
15
16 class Movie(models.Model):
17 title = models.CharField(max_length=45)
18 release_date = models.DateField(auto_now=False, null=Tru e)
19 running_time = models.TimeField(auto_now=False, null=Tru e)
20 class Meta:
21 db_table="movies"
22
23 class Actor_Movie(models.Model):
24 actors = models.ForeignKey('Actor', on_delete=models.CAS CADE)
25 movies = models.ForeignKey('Movie', on_delete=models.CAS CADE)
26 class Meta:
27 db_table="actor_movie"
위 모델링에서 참조와 역참조를 확인차 middle table에 shell을 통해 데이터를 넣어보겠습니다.
# a에 하정우 정보를 담고
a = Actor.objects.get(id=1)
#b에는 암살
b = Movie.objects.get(id=1)
# manytomany 로 연결되어 있는 movies를 이용해 정참조로 값을 넣어준다
# middle table에 값을 넣기
a.movies.add(b)
#역참조
b.actor_set.add(a)
배우가 출연한 모든 영화작품을 불러오기
10 class MoviesView(View):
11 def get(self,request):
12 ac = Actor.objects.all()
13 results=[]
14 for a in ac:
15 results.append(
16 {
17 "first_name" : a.first_name,
18 "movies" : [i.title for i in a.movies.all()],
19 }
20 )
21 return JsonResponse({"result":results}, status = 201)
영화에 출연한 배우
24 class ActorView(View):
25 def get(self,request):
26 m = Movie.objects.all()
27 results=[]
28 for a in m:
29 results.append(
30 {
31 "title" : a.title,
32 "release_date" : a.release_date,
33 "running_time" : a.running_time,
34 "actor" : [i.last_name for i in a.actor_set.all()],
35 }
36 )
37 return JsonResponse({"result":results}, status = 201)