[英]Custom filter in Django admin for calculated fields
# 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']
現在我在 admin 中有兩列: Author和Books count 。
我需要添加DateFieldListFilter
,但對於計算字段(而不是模型字段)。
例如,要顯示每個作者為last_week 、 last_month 、 last_year等創建的書籍計數的可能性。
老問題,您可能已經找到了答案,但我今天(主要是)確實做到了這一點-我認為您無法使用過濾器進行計數,因為過濾器實際上不是這樣做的在 Django 管理員中; 但是應用過濾器返回的結果數量確實顯示在頁面上
根據我的發現,計算字段可以與ModelAdmin 中的list_display一起使用 - 與您對books_count所做的完全一樣
但是要創建自定義Filter ,您必須使用子類並使用查詢; 如果你考慮正在發生的事情的內部運作,這是有道理的
希望有人覺得這很有用!
from django.contrib import admin
from datetime import datetime, timedelta
class DateFieldListFilter(admin.SimpleListFilter):
title = 'Book Count Filter'
parameter_name = 'books_count'
def lookups(self, request, model_admin):
return (
('last_week', 'Last Week'),
('last_month', 'Last Month'),
('last_year', 'Last Year'),
)
def queryset(self, request, queryset):
value = self.value()
today = datetime.today().date()
if value == 'last_week':
start_date = today - timedelta(days=7)
return queryset.filter(created__gte=start_date)
elif value == 'last_month':
start_of_month = today.replace(day=1)
end_of_last_month = start_of_month - timedelta(days=1)
start_date = end_of_last_month.replace(day=today.day)
return queryset.filter(created__gte=start_date)
elif value == 'last_year':
start_date = today.replace(year=today.year - 1)
return queryset.filter(created__gte=start_date)
return queryset
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
list_display = ['author', 'books_count']
list_filter = (DateFieldListFilter,)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.