[Django]ManyToManyField

jiminnote·2022년 6월 8일
0

🌱Django

목록 보기
10/13
post-thumbnail

📍ManyToManyField

자동으로 중간 테이블을 설정
정참조와 역참조 객체 호출

  • 정참조의 경우 : 속성으로 접근
  • 역참조의 경우 : _set 또는 related_name 으로 접근

🌱 models.py

1. ManyToManyField()쓰지않고 다대다 연결하기


class Drink(models.Model):
    korean_name = models.CharField(max_length=45)
    english_name = models.CharField(max_length=45)
    description = models.TextField(blank=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    
    
    class Meta:
        db_table='drinks'
    
class Allergy_drink(models.Model):  #다대다 연결할 중간테이블의 클래스 생성
    allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
    drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
    class Meta:
        db_table='allergies_drinks'
        
class Allergy(models.Model): 
    name = models.CharField(max_length=45)
    
    class Meta:
        db_table='allergies'

2. ManyToManyField()사용하여 다대다 연결하기

from django.db import models

# Create your models here.
class Menu(models.Model):
    name = models.CharField(max_length=45)
    
    class Meta:
        db_table='menus'

class Category(models.Model):
    type = models.CharField(max_length=45)
    menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
    
    class Meta:
        db_table='categories'
    

class Drink(models.Model):
    korean_name = models.CharField(max_length=45)
    english_name = models.CharField(max_length=45)
    description = models.TextField(blank=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    allergies = models.ManyToManyField("Allergy") #ManyToManyField()사용
   
    class Meta:
        db_table='drinks'
    
#ManyToManyField()사용했기 때문에 별도의 중간테이블 생성을 위한 클래스만들 필요X
        
class Allergy(models.Model):
    name = models.CharField(max_length=45)
    
    class Meta:
        db_table='allergies'

위 두가지 방법 모두 결과는 아래와 같다.
ManyToManyField()사용하면 별도의 중간테이블을 만들지 않아도 자동으로
allergies_drinks라는 테이블이 생성되고 자동으로 외래키를 받는다

👉 테이블명으로 직접 지정하고 싶다면

 allergies = models.ManyToManyField("Allergy",db_table=allergy_drink"")

데이터 접근하기

1번 방법으로 다대다 연결을 할 때에는 데이터를 가져올 때 allergies.all()하면 되지만
2번 방법으로 다대다 연결을 할 때에는 AttributeError가 발생한다
allergies_set.all()으로 사용해야한다.


ManyToManyField() 이점

  • 클래스를 따로 관리하지 않아도 된다.
  • 중간 테이블을 거치지 않고, 언제든지 데이터를 쉽게 추가하고 가져올 수 있다.
  • 접근성이 좋다.
profile
Hello. I'm jimin:)

0개의 댓글