Джанго Двусторонние отношения
Я строю блог-сайт и у меня есть модели в отношении категории и постов. Сообщения имеют отношение "многие ко многим" для категории.
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.