How can I, in a single expression, get the latest value from the filtered results of a many-to-one relationship to annotate a Django Quer
You should be able to do this with the new Subquery functionality, which is also available as a backport to 1.8+.
try:
from django.db.models.expressions import Subquery, OuterRef
except ImportError:
from django_subquery.expressions import Subquery, OuterRef
class LoremAdmin(admin.ModelAdmin):
# …
def get_queryset(request):
queryset = super().get_queryset(request)
status_event_per_lorem = LoremStatusEvent.objects.filter(
lorem=OuterRef('pk'))
latest_status_event_per_lorem = (
status_event_per_lorem.order_by(
'pk', '-created').distinct('pk'))
latest_status_event_for_ipsum_foo = (
latest_status_event_per_lorem.filter(ipsum='foo'))
latest_status_event_for_ipsum_bar = (
latest_status_event_per_lorem.filter(ipsum='bar'))
queryset = queryset.annotate(
foo_status=Subquery(
latest_status_event_for_ipsum_foo.values('status')[:1]),
bar_status=Subquery(
latest_status_event_for_ipsum_bar.values('status')[:1]),
)
return queryset