问题描述
我有这两个模型:
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)