Как получить доступ к связанной таблице в django
В моем блоге есть несколько рецептов в каждой записи блога. И рецепты используются более одного раза во всех записях блога.
Я пытаюсь создать страницу, на которой я могу отобразить все рецепты в виде сетки. Когда посетитель нажимает на рецепт, я хочу, чтобы он был связан с первой записью блога в базе данных, которая включает этот конкретный рецепт. Потому что у меня есть html-страницы для каждой записи блога, но не для каждого рецепта.
Я не могу понять, как это будет структурировано и реализовано. Должен ли я перепроектировать модели или есть способ сделать это с помощью шаблонов django? Любая помощь будет оценена по достоинству!
models.py
class Posts(models.Model):
title = models.CharField(max_length=155)
summary = models.TextField(blank=True, null=True)
slug = models.SlugField(unique=True, max_length=155)
recipes = models.ManyToManyField('Recipes', through='PostRecipes')
class PostRecipes(models.Model):
post = models.ForeignKey('Posts', models.DO_NOTHING)
recipe = models.ForeignKey('Recipes', models.DO_NOTHING)
class Recipes(models.Model):
title = models.CharField(max_length=155)
summary = models.TextField(blank=True, null=True)
content = models.TextField(blank=True, null=True)
views.py
def allrecipes(request):
recipes = Recipes.objects.all()
context = {
'recipes': recipes,
}
return render(request, "All-recipes.html", context)
All-recipes.html
{% for item in recipes %}
<a href="{{ STATIC_URL }}/{{ item.slug }}">{{ item.title }}</a>
{% endfor %}
Вы должны использовать ManyToManyField
на самом деле:
class Posts(models.Model):
title = models.CharField(max_length=155)
summary = models.TextField(blank=True, null=True)
slug = models.SlugField(unique=True, max_length=155)
class Recipes(models.Model):
title = models.CharField(max_length=155)
summary = models.TextField(blank=True, null=True)
content = models.TextField(blank=True, null=True)
posts = mdoels.ManyToManyField("Posts", related_name='recipes')
Пример документаций Django : https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/
После этого вы можете получить доступ к связанной таблице через:
Recipes.objects.first().posts # first recipe for example
Posts.objects.first().recipes # first post for example, accessing via related name
А в вашем шаблоне будет что-то вроде этого:
{% for item in recipes %}
<a href="{{ STATIC_URL }}/{{ item.posts.first.slug }}">{{ item.posts.first.title }}</a>
{% endfor %}