簡體   English   中英

Django admin 中用於計算字段的自定義過濾器

[英]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 中有兩列: AuthorBooks count

我需要添加DateFieldListFilter ,但對於計算字段(而不是模型字段)。

例如,要顯示每個作者為last_weeklast_monthlast_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM