M2M Field in Django

고준영·2021년 8월 17일
0

Django🦄

목록 보기
1/2
post-thumbnail

1. How to create M2M Field

1) Use Django ManyToManyField

class Beverages(models.Model):
    name = models.CharField(max_length=20)
    new_item = models.BooleanField(default=False)
    category = models.ForeignKey("Category", on_delete=models.CASCADE)
    allergies = models.ManyToManyField("Allergies", blank=True, related_name="beverages")

    class Meta:
        db_table = "beverages"

    def __str__(self):
        return self.name


class Allergies(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = "allergies"

    def __str__(self):
        return self.name

2) Use Middle Table

class Beverages(models.Model):
    name = models.CharField(max_length=20)
    new_item = models.BooleanField(default=False)
    category = models.ForeignKey("Category", on_delete=models.CASCADE)
    allergies = models.ManyToManyField("Allergies", through="AllergiesRelation")

    class Meta:
        db_table = "beverages"

    def __str__(self):
        return self.name


class Allergies(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = "allergies"

    def __str__(self):
        return self.name


class AllergiesRelation(models.Model):
    beverages = models.ForeignKey("Beverages", on_delete=models.CASCADE)
    allergies = models.ForeignKey("Allergies", on_delete=models.CASCADE)

    class Meta:
        db_table = "allergiesrelation"

2. M2M Field vs Middle Table

1) What is better

Django를 사용함에 있어 조금 더 유리한 방식은 Django의 ManyToManyField를 사용하는 방식이다.
그 이유는 다음과 같다
1. 중간 관계 Table를 따로 만들지 않아도 ManyToManyField는 자동으로 관계 Table를 만들어 준다.
2. 각각의 object에서 참조를 함에 있어서 ManyToManyField를 사용하는 것이 간단하다.

ManyToManyField에서 Beverages, Allergies를 서로 참조하는 방법

beverage = Beverages.objcets.get(조건)
beverage.allergies.all()

allergie = Allergies.objects.get(조건)
allergie.beverages.all()
#beverages class를 선언 할 때 allergies의 Field에 related_name을 지정 해주었기에
#allergie.beverages_set가 아닌 allergie.beverages로 호출이 가능하다.

Middle Table를 이용하며 만든 Beverages, Allergies에서 서로를 참조 하는 방법

beverage = Beverages.objcets.get(조건)
allergiesRelations=beverage.allergiesRelation_set.all()
allergie_list = []
for allergiesRelation in allergiesRelations:
	allergie_list.append(allergiesRelation.allergies)

위와 같이 beverage에 대한 allergie 정보를 받아오기 위해서는 두번의 QuerySet을 이용해야 한다.

2) ManyToManyField is better

결론적으로 참조하는 객체, 역참조 하는 객체를 불러와서 사용하는데에 ManyToManyField가 조금 더 손쉽게 사용할 수 있다.

3. How to create M2M Object

Django documents에서 확인이 가능한데, M2M Field는 create가 아닌 add함수를 사용해야 한다.

1) Add 사용 규칙

  1. add(**obj)
    add함수 안에는 QuerySet이 아닌 Obj가 들어가 주어야 한다.
    따라서 무언가 넣어주기 위해서는 filter로 받아서 넣어주는것이 아니라 get()으로 받아서 넣어주어야 한다.
  2. add(pk)
    add 함수 안에 Obj가 들어오지 않는다면 일반적으로 넣어주어야 하는 Obj의 pk값을 paramiter로 받는다

4. conclusion

ManyToManyFields는 사실 조금 어려운 부분이기는 했다. 여러개의 객체를 참조할 수 있고, 그러한 객체를 어떻게 넣어주어야 할까..? 라는 궁금증도 있었고, add()함수를 사용해야 한다는 것을 알고 나서도 이 add()함수를 python shell 에서 어떻게 넣어주어야 할까 고민이 많았다.
이러한 고민은 역시나 Document를 천천히 해석하면서 읽다보니 해결이 되는 것을 경험할 수 있었다.
잘 안될 때 Document를 확실히 읽고 이해하자!!
느리더라도 정확하게 알고가자🔥
21.08.17 위코드 2주차 화요일

profile
코드짜는귤🍊 풀스택을 지향하는 주니어 개발자 입니다🧡

0개의 댓글