【问题标题】:Django custom SimpleListFilterDjango 自定义 SimpleListFilter
【发布时间】:2020-12-15 04:09:14
【问题描述】:

我有这两个模型:

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,

【问题讨论】:

    标签: django django-admin django-admin-filters


    【解决方案1】:

    这是使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 2014-09-21
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多