Как отфильтровать набор запросов с помощью другого набора запросов, чтобы получить одно значение из списка значений в первом наборе запросов
В настоящее время я работаю над функциональностью в моем веб-приложении, Есть форма для пользователей, чтобы загрузить изображения, и когда есть более одного изображения, я перебираю изображения, чтобы сохранить каждое из них в базу данных.
Модель собственности:
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
- даже если предполагается, что в вашем приложении будет несколько изображений.