Django自定义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,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,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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...