На предыдущем уроке были рассмотрены связи "один к одному" и "один ко многим". Тогда же был упомянут и вид связи "многие ко многим".
Для этого вида связи тоже есть специальный тип поля: ManyToManyField. Этот вид связи подразумевает, что у объектов обеих моделей будет RelatedManager, отражающий множество связанных сущностей. Более того, это будет отдельный вид менеджера — ManyRelatedManager
.
В учебном проекте вы можете найти модель Tag
, на которую Post
ссылается следующим образом:
class Tag(models.TimestampedModel):
"""A tag for the group of posts."""
# ...
class Post(models.TimestampedModel):
"""A blog post."""
# ...
tags = models.ManyToManyField(Tag)
У любого поста может быть несколько тегов, а может не быть ни одного. И одним тегом можно пометить более чем один пост. Поэтому пост и тег соотносятся как "многие ко многим". Заметьте, что опция on_delete
не указана: кажется неверным удалять посты, если вдруг будет удалён тег, и уж точно не следует удалять теги при удалении помеченного ими поста.
Работают с такого рода связью следующим образом:
intro = Tag.objects.create(title='Introduction')
# INSERT INTO "blog_tag" ...
# Execution time: 0.010531s [Database: default]