Запрос к нескольким таблицам в 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')
Вернуться на верх