【问题标题】:Annotation in Django AdminDjango Admin 中的注解
【发布时间】:2019-06-11 12:21:48
【问题描述】:

我有一个模型如下:

.......
user=models.ForeignKey(settings.AUTH_USER_MODEL,null=True,blank=True)
visited = models.CharField(max_length=15)
......

我想在 Django 管理员中查看每个用户的访问次数。截至目前,我多次获得每个用户的姓名,计数为 1。

这是我的 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']

我在管理模板中得到以下结果。

user      visit_count
1          1
1          1
2          1
2          1

但我应该得到如下结果。

user      visit_count
1          2
2          2

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    假设您的 model 如下所示。

    models.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 属性,以便首先基于user 查询集GROUP BY,然后尝试为每个user 聚合visit_count

    admin.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
    

    【讨论】:

    • 这给了我错误'dict' object has no attribute '_meta'
    【解决方案2】:

    models.py

    from django.db import models
    
    class MyModel(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
        visited = models.PositiveIntigerField(default=0)
    

    signals.py

    def pre_save_user(sender, instance, *args, **kwargs):
        if MyModel.objects.filter(user=instance.user).exists():
            instance.visited = instance.visited + 1
    
    pre_save.connect(pre_save_user, sender=MyModel)
    

    【讨论】:

    • 认为你的问题错了。我要求在 django-admin 中显示数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2021-10-07
    • 2023-01-13
    • 2017-03-19
    • 2020-11-14
    • 2019-05-13
    • 2014-07-24
    相关资源
    最近更新 更多