Связь многие ко многим в Django
Связь многие ко многим - это когда запись одной таблицы может быть связана с многими записями другой, и наоборот.
Давайте посмотрим на примере. Пусть у нас есть таблица постов:
posts
- id
- title
И таблица тегов:
tags
- id
- name
Пост может иметь несколько тегов, а один тег может быть у многих постов. В базе такую связь обычно делают через промежуточную таблицу:
post_tags
- id
- post_id
- tag_id
В Django для этого есть поле
ManyToManyField. Промежуточную
таблицу фреймворк создаст сам -
явно описывать ее в простых случаях
не нужно.
Давайте создадим модель тега:
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=100)
Создадим модель поста и добавим
в нее ManyToManyField:
class Post(models.Model):
title = models.CharField(max_length=200)
tags = models.ManyToManyField(Tag)
Полный код обеих моделей будет таким:
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=100)
class Post(models.Model):
title = models.CharField(max_length=200)
tags = models.ManyToManyField(Tag)
Поле tags ставят на одной
из сторон - обычно на той, с которой
удобнее думать о связи. С другой
стороны Django даст обратный доступ
автоматически.
Сделайте следующие таблицы:
students
- id
- name
- surname
courses
- id
- name
Свяжите эти таблицы отношением
многие ко многим через
ManyToManyField.