Фильтрация значений на основе регистра, когда возвращаемые значения приводят к SyntaxError
У меня есть модель базы данных object snapshot, сохраняющая некоторые данные относительно произвольной модели в моем проекте:
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(...
^