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
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"
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을 이용해야 한다.
결론적으로 참조하는 객체, 역참조 하는 객체를 불러와서 사용하는데에 ManyToManyField가 조금 더 손쉽게 사용할 수 있다.
Django documents에서 확인이 가능한데, M2M Field는 create가 아닌 add함수를 사용해야 한다.
pk값을 paramiter로 받는다ManyToManyFields는 사실 조금 어려운 부분이기는 했다. 여러개의 객체를 참조할 수 있고, 그러한 객체를 어떻게 넣어주어야 할까..? 라는 궁금증도 있었고, add()함수를 사용해야 한다는 것을 알고 나서도 이 add()함수를
python shell에서 어떻게 넣어주어야 할까 고민이 많았다.
이러한 고민은 역시나 Document를 천천히 해석하면서 읽다보니 해결이 되는 것을 경험할 수 있었다.
잘 안될 때 Document를 확실히 읽고 이해하자!!
느리더라도 정확하게 알고가자🔥
21.08.17 위코드 2주차 화요일