Как отфильтровать набор запросов с помощью другого набора запросов, чтобы получить одно значение из списка значений в первом наборе запросов

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

Модель собственности:

class PostProperty(models.Model):
    poster = models.ForeignKey(User, on_delete=models.CASCADE)
    publish = models.BooleanField(default=False)
    title = models.CharField(max_length=300)
    category = models.CharField(choices=CategoryTypes.choices, default= CategoryTypes.FOR_RENT, max_length=50)
    category_type = models.ForeignKey(PropertyTypes,on_delete=models.CASCADE)

Затем у меня есть другая модель, которая связана с моделью собственности, которая позволяет пользователям загружать изображения для собственности на другой странице:

class PostPictures(models.Model):
    post = models.ForeignKey(PostProperty, on_delete=models.CASCADE)
    pictures = models.ImageField(default='property_post.jpg', upload_to='images/')

Создал функцию представления, которая получает изображения из формы и сжимает их, после сжатия перебирает каждое и сохраняет в бд.

                    memory_upload = []
                    for x in range(len(images)):
                       img = images[x]
                       im = Image.open(img)
                       im_io = BytesIO()
                       if im.mode != 'RGB':
                          im = im.convert('RGB')
                       im = im.resize(img_res)
                       im.save(im_io, format= 'JPEG', optimize=True, quality=50)
                       memory_upload.append(InMemoryUploadedFile(im_io, None, img.name, 'image/jpeg', im_io.tell(), None ))

                    for items in memory_upload:
                       parser = PostPictures.objects.create(post = property, pictures = items)
                    parser.save()
                    return redirect('profile')

После сохранения изображений в базе данных. Я хочу создать представление для списка свойств, где пользователь может видеть все свойства, которые он разместил, с возвратом только одного изображения из списка изображений для свойства, как мне это сделать?

Я думаю, что разобрался с этим, но, возможно, это не лучшая реализация, если у вас есть лучшая реализация для этого, я буду благодарен за ваш ответ.

lister = PostProperty.objects.filter(poster = request.user)
pix = []
    for items in lister:
        pics = PostPictures.objects.filter(post__title = items) 
        pix.append(pics[0])

context = {
        'lister':lister,
        'pix':pix, 
        }

Это выталкивает первое значение итерации, и оно также несет с собой свойства связанной модели

Попробуйте это, вы можете напрямую запросить это

PostPictures.objects.filter(post__poster=request.user)

Для получения первого изображения в кверисете вам не нужно делать ничего питонического, вы можете получить доступ к нему с помощью обратного аксессора _set:

# in your views
listings = PostProperty.objects.filter(poster=request.user)
for listing in listings:
    post_picture = listing.postpictures_set.first()
    ...
# in your template
{% for listing in listings %}
    {{ listing.postpictures_set.first.pictures }}
{% endfor %}

Кроме того, вы назвали свою модель и одно из полей как PostPictures и Pictures соответственно. Лучше использовать единственное, а не множественное число для имен моделей и полей, т.е. PostPicture и Picture - даже если предполагается, что в вашем приложении будет несколько изображений.

Вернуться на верх