Annotate a QuerySet with the latest value from a filtered join

前端 未结 1 866
眼角桃花
眼角桃花 2020-12-11 06:32

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

相关标签:
1条回答
  • 2020-12-11 07:35

    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
    
    0 讨论(0)
提交回复
热议问题