如何在Django Admin中实现计算字段和统计分析

2023-04-11 00:00:00 字段 计算 统计分析

在Django Admin中实现计算字段和统计分析可以通过自定义ModelAdmin来实现。下面是实现的步骤和代码演示:

  1. 定义模型类

假设我们有一个模型类叫做Article,其中包含字段title、content和created_time:

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
  1. 自定义ModelAdmin

我们可以自定义一个ModelAdmin类,添加计算字段和统计分析的方法。假设我们需要添加一个计算字段word_count,表示文章的字数,以及一个统计分析功能,可以统计文章数量、平均字数和最新文章的日期。代码如下:

from django.contrib import admin
from django.db.models import Count, Avg, Max
from django.utils.html import format_html

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'created_time', 'word_count', 'article_stats')

    def word_count(self, obj):
        return len(obj.content.split())

    word_count.short_description = '字数'

    def article_stats(self, obj):
        qs = Article.objects.all().annotate(
            num_articles=Count('id'),
            avg_word_count=Avg('content__word_count'),
            latest_article=Max('created_time')
        )
        if qs.exists():
            stats = qs[0]
            return format_html(
                '{}篇文章,平均{}字,最新文章于{}发布'.format(
                    stats.num_articles, int(stats.avg_word_count), stats.latest_article.strftime('%Y-%m-%d')
                )
            )
        else:
            return '还没有发表过文章'

    article_stats.short_description = '文章统计'

admin.site.register(Article, ArticleAdmin)

在上面的自定义ModelAdmin中,我们定义了两个方法:

  • word_count(obj): 根据content字段计算文章的字数,并在Django Admin中展示;
  • article_stats(obj): 统计所有文章的数量、平均字数和最新文章的日期,并在Django Admin中展示。
  1. 测试功能

在Django Admin中,我们现在可以看到文章列表中新增了计算字段word_count和统计分析功能article_stats。使用我们定义的模型类Article添加一些文章,可以看到计算字段和统计分析都起作用了。代码演示如下:

>>> from myapp.models import Article
>>> from datetime import datetime, timedelta
>>> for i in range(10):
...     Article.objects.create(
...         title='文章{}'.format(i + 1),
...         content='pidancode.com ' * (i + 1),
...         created_time=datetime.now() - timedelta(days=i + 1)
...     )
...
>>> from django.contrib import admin
>>> admin.autodiscover()
>>> admin.site.enable_nav_sidebar = False
>>> admin.site.index_title = '皮蛋编程'
>>> admin.site.site_title = '皮蛋编程'
>>> admin.site.site_header = '欢迎来到皮蛋编程'
>>> admin.site.register(Article, ArticleAdmin)

可以看到,我们成功地在Django Admin中实现了计算字段和统计分析功能。

相关文章