Получение данных многие ко многим в Django
В предыдущем уроке мы связали
посты и теги через
ManyToManyField. Напомним
структуру таблиц:
posts
- id
- title
tags
- id
- name
post_tags
- id
- post_id
- tag_id
Теги поста доступны через
поле tags. Давайте
получим пост и выведем
его теги:
from main.models import Post
post = Post.objects.get(id=1)
tags = post.tags.all()
for tag in tags:
print(tag.name)
С обратной стороны Django создает
менеджер post_set
(или имя из related_name).
Давайте получим тег и выведем
его посты:
from main.models import Tag
tag = Tag.objects.get(id=1)
posts = tag.post_set.all()
for post in posts:
print(post.title)
Связи можно менять методами
менеджера. Метод add
добавляет тег посту:
python = Tag.objects.get(name='python')
post = Post.objects.get(id=1)
post.tags.add(python)
Метод set заменяет весь
набор связей новым списком:
python = Tag.objects.get(name='python')
django = Tag.objects.get(name='django')
post = Post.objects.get(id=1)
post.tags.set([python, django])
Метод remove убирает
одну связь:
post.tags.remove(python)
Получите студента вместе с курсами, которые он проходил.
Получите курс вместе со студентами, которые его проходили.
Добавьте студенту два курса через
add, затем уберите один
через remove.