---
description: '210810'
---

# Relations - 다대다 관계

## tag 모델 만들기

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

* 예를 들면 tag가 있다.

`models.py`

```python
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`

```python
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`

```markup
{% 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 페이지 만들기

![](https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MgjjOStCXaKn2jAuxtZ%2F-MgmoAi9u_5_G7rJSd9A%2Fimage.png?alt=media\&token=37acc2a4-ec02-4210-99d3-4b38532a6a32)

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

`post_list.html`

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

