如何在Django Admin中实现计算字段和统计分析
在Django Admin中实现计算字段和统计分析可以通过自定义ModelAdmin来实现。下面是实现的步骤和代码演示:
- 定义模型类
假设我们有一个模型类叫做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
- 自定义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中展示。
- 测试功能
在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中实现了计算字段和统计分析功能。
相关文章