У меня есть две модели:
class Gallery(models.Model):
site = models.ForeignKey(Site, related_name='galleries', on_delete=models.CASCADE)
created = models.DateTimeField(_('created'), auto_now_add=True)
class Photo(models.Model):
image = ImageField(verbose_name=_('image'), upload_to=upload_path)
gallery = models.ForeignKey(Gallery, related_name='photos', on_delete=models.CASCADE)
created = models.DateTimeField(_('created'), auto_now_add=True,)
Я хочу получить три последние добавленные фотографии.Каждое фото должно быть отнесено к другой галерее.
Это решение работает, но оно также очень медленное.Можно ли заставить его работать быстрее?
limit = 3
photos = Photo.objects.annotate(
max_gallery_created=Max('gallery__photos__created'),
).filter(
gallery__site=site,
created=F('max_gallery_created'),
).order_by(
'-max_gallery_created',
)[:limit]
Я также буду удовлетворен, если получу одну последнюю добавленную фотографию из каждой из трех последних созданных галерей.Я пытался сделать это так:
galleries = Gallery.objects.filter(site=site).order_by('-created').values_list('id')[:limit]
photos = Photo.objects.filter(id__in=galleries)
Но это не мешает повторному появлению галерей.Я думал о том, чтобы как-то использовать Different (), но не знаю, насколько это просто.
Джанго 1.11.
РЕДАКТИРОВАТЬ:
Я думаю, чтодолжен привести пример для ожидаемого результата.
- Gallery1 (created 10.01.2019)
- PhotoA (created: 15.01.2019 at 12:00)
- PhotoB (created: 15.01.2019 at 11:00)
- PhotoC (created: 13.01.2019 at 11:00)
- Gallery2 (created 09.01.2019)
- PhotoD (created: 13.01.2019 at 10:00)
- PhotoE (created: 12.01.2019 at 10:00)
- PhotoF (created: 10.01.2019 at 10:00)
- Gallery3 (created 08.01.2019)
- PhotoG (created: 14.01.2019 at 11:00)
- PhotoH (created: 14.01.2019 at 11:00)
- PhotoI (created: 14.01.2019 at 11:00)
- Gallery4 (created 07.01.2019)
- PhotoJ (created: 14.01.2019 at 12:00)
- PhotoK (created: 12.01.2019 at 10:00)
- PhotoL (created: 12.01.2019 at 10:00)
В этом случае
Что я получу сейчас: PhotoA, PhotoB, PhotoJ
Что я хочу получить: PhotoA, PhotoJ, PhotoG
Я также буду удовлетворен, если получу: PhotoA, PhotoD, PhotoG