Relations - 다대다 관계

210810

tag 모델 만들기

다대다 관계는 A모델의 여러 레코드가 B모델의 여러 레코드에 연결될 수 있는 관계를 의미한다.

  • 예를 들면 tag가 있다.

models.py

tag = models.ManyToManyField(Tag, null=True, black=True)
  • 다대다 관계 타입을 만들때는 위와같이 할 수 있다.

  • ManyToManyField에서는 null이 의미가 없기 때문에 인자로 설정해도 안해도 상관이 없다.

WARNINGS:
blog.Post.tag: (fields.W340) null has no effect on ManyToManyField.

포스트 목록 페이지에 tag 추가하기

tag를 test할 때는 다음과 같이 작성할 수 있다

tests.py

self.tag_python_kor = Tag.objects.create(
            name="파이썬 공부", slug="파이썬-공부"
        )
        self.tag_python = Tag.objects.create(
            name="python", slug="python"
        )
        self.tag_hello = Tag.objects.create(
            name="hello", slug="hello"
        )

post_list.html

{% if p.tags.exists %}
    <i class="fas fa-tags"></i>
    {% for tag in p.tags.iterator %}
        <span class="badge badge-info">{{ tag }}</span>
    {% endfor %}
    <br/>
    <br/>
{% endif %}
  • 3 : p.tags.all 대신에 p.tags.iterator 를 사용했다. 둘다 기능은 동일한데 후자가 서버에 부담을 덜어준다.

tag 페이지 만들기

tag를 클릭했을 때 이동한 페이지에서 태그를 기준으로 게시물을 보여준다는 인식을 주기 위해 태크 뱃지를 위쪽에 위치시킨다.

post_list.html

{% if tag %}
<span class="badge badge-success float">
    <i class="fas fa-tags"></i> {{ tag }} ({{ tag.post_set.count }})
</span>
{% endif %}

Last updated

Was this helpful?