Django ManyToManyField TIL

$movie$models.py

from django.utils import timezone

class Actor(models.Model):
    first_name = models.CharField(max_length= 50)
    last_name = models.CharField(max_length= 50)
    date_of_birth = models.DateTimeField()
    movie = models.ManyToManyField('Movie')
    
    class Meta():
        db_table = 'actors'

class Movie(models.Model):
    title = models.CharField(max_length= 50)
    release_date = models.DateTimeField()
    running_time = models.IntegerField()
    
    class Meta():
        db_table = 'movies'

영화배우와 영화가 N : N 으로 연결되있는 모델이다.
Actor 인스턴스와 Movie 인스턴스가 다대다로 연결 시 Junction Table을 생성하여야 하지만 models.ManyToManyField를 통해 따로 테이블을 만들 필요가 없다.
Django 에서 제공되는 모듈의 기능으로 자동으로 연결 테이블생성하여 연결하기 때문이다.
사용법은 다음과 같다.
테이블 생성
models.ManyToManyField('연결할 테이블명',through ='연결결되는 테이블명')

정참조하는 테이블에서의 값추가, 제거

a = Movie.objects.get(id = 1)
b = Movie.objects.get(id = 2)
# 추가
Actor.objects.get(id = 1).movie.add(a,b)
# 제거
Actor.objects.get(id = 1).movie.remove(b)

역참조하는 테이블에서의 값추가, 제거

a = Actor.objects.get(id= 1)
b = Actor.objects.get(id= 2)
# 추가
Movie.objects.get(id = 1).actor_set.add(a,b)
# 제거
Movie.objects.get(id = 1).actor_set.remove(a)

전체 제거

# 정참조의 경우
Actors.objects.get(id = 1).movie.clear()
# 역참조의 경우
Movie.objects.get(id = 1).actor_set.clear()

Junction table에서 추가적인 column 값이 존재하지 않으면 테이블을 생성하지않고 ManyToManyField를 통해 테이블간 N:N 연결하여 쓸 수 있다.

좋은 웹페이지 즐겨찾기