django - Annotation in Django Admin
问题描述
I have a model as below:
.......
user=models.ForeignKey(settings.AUTH_USER_MODEL,null=True,blank=True)
visited = models.CharField(max_length=15)
......
I want to see in Django admin, each user with visited count. As of now I get name of each user multiple times and count is 1.
This is my admin.py.
class modelnameadmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(modelnameadmin, self).get_queryset(request)
return qs.annotate(visit_count=Count('visited',distinct=True)).order_by('visit_count')
def visit_count(self, inst):
return inst.visit_count
list_display = ['user','visit_count']
I am getting below results in admin template.
user visit_count
1 1
1 1
2 1
2 1
But I should get result as below.
user visit_count
1 2
2 2
解决方案
假设您的模型如下所示。
模型.py
from django.db import models
from django.contrib.auth.models import User
class MyModel(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
visit_count = models.PositiveIntigerField(default=0)
因此,您可以在查询集values
上使用属性,以便首先GROUP BY
基于user
查询集,然后尝试visit_count
为每个user
.
管理员.py
from django.db.models.aggregates import Sum
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
list_display = ['user', 'visit_sum']
def get_queryset(self, request):
queryset = super(MyModelAdmin, self).get_queryset(request)
return queryset.values('user').annotate(visit_sum=Sum('visit_count')).order_by('-visit_sum')
def visit_sum(self, obj):
return obj.visit_sum
推荐阅读
- ionic-framework - 应用程序浏览器中的离子在其他浏览器中打开网址
- python - Tkinter Python - 带有滚动条、画布和按钮的框架(滚动条不起作用)
- sql - 规范化 SQL 表 - 将 1 行转换为 6 行
- python - 如何将类对象添加到列表中?
- react-native - 反应本机设置错误。无法创建Java虚拟机
- node.js - 因未创建 Visual Studio 2017 而获得。原因?
- svg - 如何使用 SVG 作为 PWA 图标?
- java - Java 11 - ReflectionUtil cxf-core 字段 java.net.Authenticator.theAuthenticator
- javascript - 如何修复脚本标签中的 src 属性
- scala - Intellij IDEA: sbt compile 在命令中是ok的,但是为什么build.sbt是红色高亮的?