django는 template 언어를 지원해주지만 전문적인 프로그래밍 언어는 아니기 때문에 break와 continue 같은 기능을 제공해주지는 않습니다. 따라서 views.py를 통해 template에 오브젝트를 보내줄 때에는 필요한 것들만 보내주는 것이 좋습니다. 다음은 category app models.py의 일부분입니다.
class Category(models.Model):
category_name = models.CharField(max_length=50, unique=True)
is_available = models.BooleanField(default=False)
def __str__(self):
return self.category_name
class Subcategory(models.Model):
subcategory_name = models.CharField(max_length=50, unique=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
is_available = models.BooleanField(default=False)
def __str__(self):
return self.subcategory_name
subcategory가 category를 외래키를 참조하는 구조입니다. 예를 들어 category는 전자기기, subcategory는 이어폰, 태블릿 pc가 있다고 가정하겠습니다. 이때 "전자기기 > 이이폰, 태블릿 pc"와 같이 표현하여 전자기기 밑에 이어폰과 태블릿 pc가 있다는 것을 표현하고자 할 때 어떻게 해야 할까요?
category와 subcategory를 전부 오브젝트로 전송하여 각각이 반복문을 돌면서 subcategory의 category가 category와 같을 때 이름을 표현해주고, 그다음에 차례로 subcategory를 표현하는 방법 또는 subcategory를 오브젝트로 보내 subcategory의 category 이름을 표현한 다음에 차례로 subcategory를 표현하는 방법 둘 중에 어느 하나도 break나 continue가 없다면 원하는 방향으로 표현할 수 없습니다.
이때 사용 가능한 것이 바로 models.py의 함수입니다.
class Category(models.Model):
...
def get_subcategories(self):
return self.subcategory_set.all()
get_subcategories는 related_name을 사용하여 자신을 참조하고 있는 subcategory를 반환해주는 함수입니다. 따라서 위의 예시를 표현하기 위해서는 category의 get_subcategories를 실행하여 반환된 subcategory들에 대해서만 반복문을 통해 표현하는 것으로 해결할 수 있습니다.
'Python > Django' 카테고리의 다른 글
[Django] SMTP 이메일 보내기 (0) | 2021.08.03 |
---|---|
[Django] HTTP_REFERER 사용하여 이전 페이지로 가기 (0) | 2021.07.30 |
[Django] context_processor는 뭐야? (0) | 2021.07.20 |
[Django] AWS Lightsail 사용하여 프로젝트 공개 (0) | 2021.07.19 |
[Django] Permission은 뭐야? (0) | 2021.07.15 |