Обратная сторона ForeignKey в Django
Мы уже умеем из поста получить категорию. Теперь сделаем наоборот: из категории получим все ее посты. Структура таблиц та же:
categories
- id
- name
posts
- id
- title
- category_id
Со стороны категории Django сам
создает обратный доступ к постам.
По умолчанию это менеджер
post_set: имя связанной
модели в нижнем регистре плюс
_set.
Давайте получим категорию и выведем ее посты:
from main.models import Category
category = Category.objects.get(id=1)
posts = category.post_set.all()
for post in posts:
print(post.title)
Имя post_set не всегда
удобно. Его можно задать самому
через параметр related_name
у ForeignKey:
class Post(models.Model):
title = models.CharField(max_length=200)
category = models.ForeignKey(
Category,
on_delete=models.CASCADE,
related_name='posts'
)
Теперь посты категории доступны
как category.posts.all():
category = Category.objects.get(name='News')
posts = category.posts.all()
for post in posts:
print(post.title)
Можно получить все категории и для каждой вывести посты:
categories = Category.objects.all()
for category in categories:
print(category.name)
for post in category.posts.all():
print(' -', post.title)
Получите одну страну вместе
с ее городами через
city_set.
Добавьте related_name='cities'
и получите города страны через
новое имя.
Получите все страны вместе с их городами.