Аннотация в Джанго Админ - PullRequest
2 голосов
/ 11 июня 2019

У меня есть модель, как показано ниже:

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

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Предположим, ваша модель похожа на приведенную ниже.

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 в вашем наборе запросов, чтобы сначала GROUP BY набор запросов был основан на user, а затем попытаться агрегировать visit_count для каждого user.

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
0 голосов
/ 11 июня 2019

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