Джанго Двусторонние отношения

Я строю блог-сайт и у меня есть модели в отношении категории и постов. Сообщения имеют отношение "многие ко многим" для категории.

class Post(models.Model):
     categories = models.ManyToManyField(Category)

Все работает хорошо, за исключением того факта, что в списке категорий в шаблоне я хочу загружать только те категории, которые действительно имеют сообщения.

Если категория пуста, я не хочу ее отображать, я попытался определить отношение в категории для публикации, чтобы позволить мне использовать что-то вроде {{ if category.posts }}, В настоящее время использование другого поля "Многие ко многим" в категории в настоящее время дает мне дополнительное поле в админке, которое я на самом деле не хочу или считаю необходимым.

Как лучше ориентироваться в этих отношениях или создать подходящие?

Cheers Kev

2 ответа

Решение

Ты можешь использовать reverse relations на ManyToMany поля. В обратном фильтре вы должны использовать имя связанной модели (если вы не использовали related_name атрибуты). Таким образом, в вашем вопросе вы можете использовать название модели в качестве обратного имени, например:

{% if category.post %}

Вы также можете использовать это в своих функциях фильтрации в представлениях:

Category.objects.filter(post__isnull=False)

Имя обратной связи должно быть в нижнем регистре.

Проверьте документацию здесь

Django автоматически создает поле в связанной модели любого отношения ForeignKey или ManyToMany. Вы можете управлять именем поля в связанной модели с помощью опции related_name, например:

class Post(models.Model):
 categories = models.ManyToManyField(Category,related_name='posts')

Таким образом, ваш подход работает без каких-либо дополнительных полей. Кстати, если вы пропустите аргумент related_name, Django создаст по умолчанию один с [field_name]_set.

Другие вопросы по тегам