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주차 화요일