Django

[django]1대 다 join prefetch_related사용법(ORM방식)

a-몬드 2022. 4. 20. 09:23
반응형

다른 블로그들 잘 정리해 놓은 블로그들이 많았다.

하지만 prefetch_related('') 괄호안에 외래키값를 넣어도 안되고 join할  모델명을 넣어도 join되지 않았다.

이것 저것 조사해본 결과 알게 된것을 나같은 장고 초보자 들도 알 수있게 써보려고 한다.

 

일단 join할 모델에 대한 설명

class Medicine(models.Model) :
    med_uid = models.AutoField(primary_key=True)
    user_uid = models.ForeignKey(USER.User,on_delete=models.SET_NULL,db_column='user_uid',null=True)
    med_name = models.CharField(max_length=20)
    med_type = models.CharField(max_length=8)
    med_buyprice = models.PositiveIntegerField()
    med_sellprice = models.PositiveIntegerField()
    med_cgst = models.PositiveSmallIntegerField()   
    med_sgst = models.PositiveSmallIntegerField()   
    med_expire = models.DateField()
    med_mfg = models.DateField()
    med_desc = models.TextField()
    med_instock = models.PositiveIntegerField()
    med_qty = models.PositiveSmallIntegerField()
    med_company = models.CharField(max_length=30)

class Med_salt(models.Model) :
    salt_uid = models.AutoField(primary_key=True)
    med_uid = models.ForeignKey(Medicine, related_name="med_salt_set", on_delete=models.CASCADE, db_column='med_uid')
    salt_name = models.CharField(max_length=20)
    salt_qty = models.DecimalField(max_digits=5, decimal_places=3) 
    salt_qty_type = models.CharField(max_length=20)

medicine의 상세 성분표가 med_salt이다.

medicine의 list를 조회할때 med_salt를 같이 join하여 조회하는데

약품에 성분 한개만 존재하는 것이 아니라 여러개 존재하므로

1대 다 join을 해야한다.

 

1대 다중에서 다인 med_salt의 외래키 모델에 related_name=""을 반드시 정해주고

 

prefetch_related()의 괄호 안에 related_name을 작성해 준다.

medicineList = Medicine.objects.filter(user_uid=user_uid).prefetch_related('med_salt_set')

1대 다 join을 통해 뽑힌 데이터를 보기 위해

for문과 values()를 이용하여 콘솔창에 찍어서 확인해 볼 수 있다.

 for data in medicineList:
 	print(data.med_salt_set.values())

반응형