Фильтрация значений на основе регистра-когда возвращаемые значения приводят к синтаксической ошибке

#python #django #django-orm

Вопрос:

У меня есть модель базы данных моментальных снимков объектов, в которой сохраняются некоторые данные о любой произвольной модели в моем проекте:

 class ObjectSnapshot(Model):
    user = ForeignKey(to=User, on_delete=SET_NULL, null=True, blank=True)
    timestamp = DateTimeField(verbose_name=_("Date when the document was generated"), auto_now_add=True)
    content_type = ForeignKey(ContentType, on_delete=CASCADE)
    object_id = PositiveIntegerField(verbose_name=_("Id of the referenced object"))
    content_object = GenericForeignKey("content_type", "object_id")
    data = JSONField(verbose_name=_("Serialized object"), default=dict, null=False, blank=True)

 

Там может быть несколько снимков на один и тот же объект (ссылки те же object_id , а content_type ), есть также некоторые снимки, которые ссылаются на тот же «логический объект», что означает, что, например, object_id отличается, но эти объекты используют некоторые значения полей, что означает, что они имеют один и тот же объект (это будет объяснено лучше на запрос пример ниже).

Теперь я хочу написать запрос, извлекающий список этих объектов, аннотированный их «предыдущей» записью.

 ObjectSnapshot.objects.annotate(
    previous_id=Subquery(
        ObjectSnapshot.objects.filter(
            content_type=OuterRef('content_type'),
            object_id__in=Case(
                When(
                    content_type__model='somemodel',
                    then=Subquery(
                        SomeModel.objects.filter(
                            field_name=Subquery(  # the `field_name` refers to the same "logical object"
                                SomeModel.objects.filter(
                                    id=OuterRef(OuterRef('object_id')),
                                ).values(
                                    'field_name'
                                )[:1]
                            ),
                        ).annotate(ids=ArrayAgg('id')).values('ids')[:1],
                    ),
                ),
                default=ArrayAgg(OuterRef('object_id')),
                output_field=ArrayField(base_field=IntegerField()),
            ),
        ).exclude(
            pk=OuterRef('pk')
        ).values_list(
            'object_id'
        ).order_by(
            '-timestamp'
        )[:1]
    )
)
 

Пытаясь выполнить этот запрос, я получаю:

 syntax error at or near "ARRAY_AGG"
LINE 1: ...g_objectsnapshot"."id")) HAVING U0."object_id" IN ARRAY_AGG(...
                                                             ^