#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(...
^