Django 自定义 SimpleListFilter

Django custom SimpleListFilter

我有这两个模型:

class Intervencao(models.Model):
  .......
class Alvaras(models.Model):
    intervencao = models.ForeignKey(Intervencao, related_name='IntervencaoObjects2',on_delete=models.CASCADE)
    data_alv = models.DateField(blank=True,null=True,verbose_name="Data do alvaras")

我想在我的 Intervencao.Admin 中添加一个自定义过滤器,它查询我在 Alvaras 中的最后一条记录并检查字段 data_alv 是否为空。我已经让它工作了,但我只想要最后一条记录。

class Dataalv(admin.SimpleListFilter):
    title = ('data de alvaras')
    parameter_name = 'data_alv'

    def lookups(self, request, model_admin):
        return (
            ('yes', 'yes'),
            ('no', 'no')
        )

    def queryset(self, request, queryset):
        value = self.value()
        if value == 'yes':
           return queryset.filter(IntervencaoObjects2__data_alv__isnull=False)
        elif value == "no":
            return queryset.filter(IntervencaoObjects2__data_alv__isnull=True)
            
class IntervencaoAdmin(admin.ModelAdmin):
  list_filter = Dataalv,

这是一个使用 Subquery 的解决方案:

from django.db.models import OuterRef, Subquery

class Dataalv(admin.SimpleListFilter):
    title = ('data de alvaras')
    parameter_name = 'data_alv'

    def lookups(self, request, model_admin):
        return (
            ('yes', 'yes'),
            ('no', 'no')
        )

    def queryset(self, request, queryset):
        value = self.value()
        qs = queryset.annotate(
            data_alv=Subquery(
                (Alvaras.objects
                    .filter(intervencao_id=OuterRef('id'))
                    .order_by('-id')
                    .values('data_alv')[:1]
                )
            )
        )
        if value == 'yes':
            return qs.filter(data_alv__isnull=False)
        if value == "no":
            return qs.filter(data_alv__isnull=True)