Как отфильтровать данные, полученные с помощью аннотации?

Есть "изображения", которые привязаны к "объектам" через внешний ключ, их может быть несколько на каждом "объекте". Есть "объекты", которые также привязаны к "объектам" через внешний ключ. Как прикрепить к "теме" одно изображение из "объекта", заметил "select=1"? С помощью аннотации я могу получить либо количество изображений, либо все изображения.

Варианты, которые работают, но это не то, что вам нужно

Subject.objects.filter(object_id__hromada_id=hromada.id, state=3).annotate(image=Count('object__objectimages__image', filter=Q(object__objectimages__select=1)))

или

Subject.objects.filter(object_id__hromada_id=hromada.id, state=3).annotate(image=F('object__objectimages__image'))
class Object(models.Model):
    hromada = models.ForeignKey(Hromady, on_delete=models.CASCADE)
    state = models.IntegerField(choices=SELECT_CHOICES, default=SELECT_CHOICES[1][0])
...

class ObjectImages(models.Model):
    object = models.ForeignKey(Object, on_delete=models.CASCADE)
    image = models.ImageField(upload_to=upload_path_img)
    select = models.BooleanField(default=False)
...

class Subject(models.Model):
    object = models.ForeignKey(Object, on_delete=models.CASCADE)
    state = models.IntegerField(choices=SELECT_CHOICES, default=SELECT_CHOICES[1][0])
...

список объектов в поле Тема => Объект => 1 изображение в поле Объект изображения (выбрать=1) или нет

Вы могли бы попробовать использовать запрос, подобный этому.

queryset = (
    Subject.objects
    .filter(object__hromada_id=hromada.id, state=3)
    .annotate(
        image=models.Subquery(
            ObjectImages.objects
            .filter(object_id=models.OuterRef('object_id'), select=1)
            .values_list('image', flat=True)[:1]
        ),
    )
)

Это должно дать вам ожидаемые результаты - для каждого объекта выберите по subquery одно изображение, на котором есть select=1 и image.object_id=subject.object_id.

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