Limiting a SubQuery based on instance's OuterRef

350 views
Skip to first unread message

Nick Gashkov

unread,
Jan 29, 2019, 7:48:07 AM1/29/19
to Django users
Hello there!

Is it possible to limit a SubQuery to a dynamic value of an instance in a QuerySet? I.e. I'm looking for something like:

queryset = model.objects.filter(field=OuterRef('field')).values('another_field')[:OuterRef('number')]

Sincerely,
Nick Gashkov

Simon Charette

unread,
Jan 29, 2019, 10:53:49 AM1/29/19
to Django users
Hello Nick,

It isn't possible to reference columns in a LIMIT clause AFAIK.

I'd suggest you use a RowNumber[0] window function ordered by your number column in a
subquery and filter on the annotated value in the outer query.

Cheers,
Simon

Nick Gashkov

unread,
Jan 30, 2019, 5:27:26 AM1/30/19
to Django users
Simon,

Thank you for fast reply! I've tried to rewrite a query using RowNumber()...

inner_subquery = queryset.objects.filter(date__gte=today, day_type='working_day')
inner_subquery = inner_subquery.annotate(row_number=Window(expression=RowNumber(), order_by=F('number').asc()))
inner_subquery = inner_subquery.filter(pk=OuterRef('pk'))
inner_subquery = inner_subquery.values('row_number')[:1]

outer_subquery = queryset.objects.annotate(row_number=Subquery(inner_subquery))
outer_subquery = outer_subquery.filter(row_number=OuterRef('number'))
outer_subquery = outer_subquery.values('value')[:1]

queryset = queryset.annotate(result=Subquery(outer_subquery))


...but stumbled upon a following exception:

Expression contains mixed types. You must set output_field.

Am I doing something wrong?

Reply all
Reply to author
Forward
0 new messages