Django admin中计算字段的自定义筛选器

Django admin中计算字段的自定义筛选器,django,django-admin,Django,Django Admin,现在我在管理中有两列:作者和图书计数 我需要添加DateFieldListFilter,但用于计算字段(不用于模型字段) 例如,有一个“可能性秀”,每个作者在上周、上个月、上一年等期间创作的图书数量都会计算。这是一个老问题,你可能已经找到了答案,但我今天(大部分时间)确实做了这件事——我不认为你能通过过滤器获得数量,因为在Django admin中过滤器并不是这样做的;但是,应用过滤器返回的结果数量已经显示在页面上 根据我的发现,计算字段可以与模型管理员中的列表显示一起使用——与您对书籍计数所做

现在我在管理中有两列:作者图书计数

我需要添加
DateFieldListFilter
,但用于计算字段(不用于模型字段)


例如,有一个“可能性秀”,每个作者在上周、上个月、上一年等期间创作的图书数量都会计算。

这是一个老问题,你可能已经找到了答案,但我今天(大部分时间)确实做了这件事——我不认为你能通过过滤器获得数量,因为在Django admin中过滤器并不是这样做的;但是,应用过滤器返回的结果数量已经显示在页面上

根据我的发现,计算字段可以与模型管理员中的列表显示一起使用——与您对书籍计数所做的完全相同

但是要创建一个自定义的过滤器,您必须使用一个子类并处理查询;如果你考虑一下正在发生的事情的内部运作,这是有道理的

希望有人觉得这很有用

来自django.contrib导入管理
从datetime导入datetime,timedelta
类DateFieldListFilter(admin.SimpleListFilter):
title='书籍计数过滤器'
参数_name='books_count'
def查找(自我、请求、型号管理):
返回(
(“上周”、“上周”),
(“上个月”、“上个月”),
(‘去年’、‘去年’),
)
def查询集(自我、请求、查询集):
value=self.value()
今天=日期时间。今天()。日期()
如果值==“上周”:
开始日期=今天-时间增量(天=7)
返回queryset.filter(创建日期=开始日期)
elif值==“上个月”:
开始月份=今天。替换(天=1)
上个月的结束时间=上个月的开始时间-时间差(天数=1)
开始日期=上个月的结束日期。替换(天=今天。天)
返回queryset.filter(创建日期=开始日期)
elif值==“上一年”:
开始日期=今天。替换(年份=今天。年份-1)
返回queryset.filter(创建日期=开始日期)
返回查询集
@管理员注册(作者)
类AuthorAdmin(admin.ModelAdmin):
列表显示=['作者','书籍计数']
列表\过滤器=(DateFieldListFilter,)
def get_queryset(自我,请求):
qs=super(AuthorAdmin,self).get\u queryset(请求)
返回qs.annotate(books\u count=count('books'))
def书籍计数(自身、仪器):
返回仪器书籍计数

这是一个老问题,你可能已经找到了答案,但我今天(大部分时间)就这么做了——我不认为你可以通过过滤器获得计数,因为在Django admin中过滤器并不是这样做的;但是,应用过滤器返回的结果数量已经显示在页面上

根据我的发现,计算字段可以与模型管理员中的列表显示一起使用——与您对书籍计数所做的完全相同

但是要创建一个自定义的过滤器,您必须使用一个子类并处理查询;如果你考虑一下正在发生的事情的内部运作,这是有道理的

希望有人觉得这很有用

来自django.contrib导入管理
从datetime导入datetime,timedelta
类DateFieldListFilter(admin.SimpleListFilter):
title='书籍计数过滤器'
参数_name='books_count'
def查找(自我、请求、型号管理):
返回(
(“上周”、“上周”),
(“上个月”、“上个月”),
(‘去年’、‘去年’),
)
def查询集(自我、请求、查询集):
value=self.value()
今天=日期时间。今天()。日期()
如果值==“上周”:
开始日期=今天-时间增量(天=7)
返回queryset.filter(创建日期=开始日期)
elif值==“上个月”:
开始月份=今天。替换(天=1)
上个月的结束时间=上个月的开始时间-时间差(天数=1)
开始日期=上个月的结束日期。替换(天=今天。天)
返回queryset.filter(创建日期=开始日期)
elif值==“上一年”:
开始日期=今天。替换(年份=今天。年份-1)
返回queryset.filter(创建日期=开始日期)
返回查询集
@管理员注册(作者)
类AuthorAdmin(admin.ModelAdmin):
列表显示=['作者','书籍计数']
列表\过滤器=(DateFieldListFilter,)
def get_queryset(自我,请求):
qs=super(AuthorAdmin,self).get\u queryset(请求)
返回qs.annotate(books\u count=count('books'))
def书籍计数(自身、仪器):
返回仪器书籍计数
# models.py

class Author(models.Model):
   name = models.CharField(max_length=50)

class Book(models.Model):
   title = models.CharField(max_length=50)
   created_time = models.DateTimeField(auto_now=False, auto_now_add=True)
   writer = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')

# admin.py

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):

    def get_queryset(self, request):
        qs = super(AuthorAdmin, self).get_queryset(request)
        return qs.annotate(books_count=Count('books'))

    def books_count(self, inst):
        return inst.books_count

    list_display = ['author', 'books_count']