Запрос к нескольким таблицам в Django и получение консолидированного результата
Я создаю приложение для блога на Django и в настоящее время застрял на запросе данных. Я создаю пост, а затем загружаю несколько изображений в этот пост.
Это моя модель записи в блоге.
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT)
title = models.CharField(max_length=255)
description = models.CharField(max_length=1000,null=True)
Tags = models.CharField(max_length = 255,null=True,blank=True)
Created_date = models.DateTimeField(auto_now_add=True)
Updated_date = models.DateTimeField(auto_now=True)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
А это моя модель изображений
class Images(models.Model):
Post = models.ForeignKey(Post,on_delete=models.CASCADE)
image = models.ImageField(upload_to='media/')
Теперь, используя эту реализацию, у меня есть 2 таблицы в DB, в которых данные хранятся, как и ожидалось. В первой таблице хранятся все данные, связанные с постом, а во второй таблице хранятся ID, Post_Id, Image_URL. Если я загружаю 3 изображения, то создается три строки.
Теперь я хочу запросить данные, которые -> Я хочу все посты и я хочу все изображения в соответствии с постами.
Я могу получить отдельные запросы для Post и Images, но как это можно сделать в Django ORM? Как я могу запросить данные?
Вы можете использовать следующим образом;
post = Post.objects.all().prefetch_related('images_set').get(pk=1)
images = post.images_set.all() # this will bring you all images related to
post
Предположим, что у вас есть представление, которое заполняет контекстную переменную posts набором запросов типа Post.objects.all() ваш шаблон может выглядеть следующим упрощенным образом
{% for post in posts %}
{{ post.title }}
{{ post.category }}
{{ post.description }}
...
{% for image in post.images_set.all %}
{{ image.image.url }}
{% endfor %}
{% endfor %}
Каждый раз при итерации post.images_set.all вы будете выполнять другой запрос, вам следует использовать prefetch_related, чтобы не выполнять запрос каждый раз и данные кэшировались
posts = Post.objects.prefetch_related('images_set')