Django ManyToMany Field 확장하기

김기현·2022년 2월 12일
0
post-thumbnail

MantToMany field인 Drink 필드와 Allergy 필드! 이 두 필드를 ManyToMany로 연결할 수 있지만 연결하는 테이블을 만들어 ForeignKey로 Drink와 Allergy를 선언하는 방법도 있는데요~ 오늘은 이 두 테이블 사이에 징검다리 역할을 하는 테이블을 어떻게 만들고 연결하는지 알아보겠습니다.

위의 ORM을 보면 drink와 allergy는 ManyToMany 관계로 중간에 allergy_drink라는 테이블이 이 둘을 연결하고 있는데요! 이를 연결하기 위해서는 through를 입력해 MantToMany field가 사용할 model을 지정해줍니다.

class Drink(models.Model):
    category = models.ForeignKey(
        "Category", related_name="drinks", on_delete=models.CASCADE, null=True
    )
    korean_name = models.CharField(max_length=45)
    english_name = models.CharField(max_length=45)
    description = models.TextField(max_length=300)

    class Meta:
        db_table = "drinks"  # DB에 표시되고 사용할 테이블 명


class Allergy(models.Model):
    name = models.CharField(max_length=45)
    drinks = models.ManyToManyField(
        Drink, related_name="allergies", through="AllergyDrink"
    )

    class Meta:
        db_table = "allergies"
        
        
class AllergyDrink(models.Model):		# 두 모델을 연결하는 테이블
    allergy = models.ForeignKey(
        "Allergy", related_name="allergydrinks", on_delete=models.CASCADE, null=True
    )
    drink = models.ForeignKey(
        "Drink", related_name="allergydrinks", on_delete=models.CASCADE, null=True
    )

    class Meta:
        db_table = "allergy_drinks"

db_table에 들어갈 테이블은 django에서 자동으로 생성한 table이름으로 해주고 이를 사용해야 해서 직접 지정해주었습니다. class Meta는 class안의 class라고 생각하면 편하며 ordering, verbose_name_plural 등 옵션들을 선택해줄 수 있습니다.

확장 후(model을 수정한 후)에는 항상 migrate를 해 데이터베이스에 반영하도록 합니다. 꼭!

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글