gpt4 book ai didi

带有计数注释的 django admin list_display

转载 作者:行者123 更新时间:2023-12-05 01:16:26 26 4
gpt4 key购买 nike

我想在 Django Admin 的 list_display 中添加“annotation count”字段。

模型.py

class Log(models.Model):
...
ip_address = models.GenericIPAddressField(
verbose_name=_('IP address'),
db_index=True,
)
...

管理员.py

class LogAdmin(admin.ModelAdmin):
list_display = (..., 'ip_address', 'ip_address_count', ...)

def ip_address_count(self, instance):
return models.Log.objects \
.filter(ip_address=instance.ip_address) \
.count()

ip_address_count.short_description = _('IP Address Count')

它适用于“LOTS OF”SQL 查询。

我想像这样改进我的 admin.py:

class Log(models.Model):
...

def get_queryset(self, request):
qs = super(LogAdmin, self).get_queryset(request)
qs = qs.values('ip_address') \
.annotate(ip_address_count=Count('ip_address'))
return qs

def ip_address_count(self, instance):
return instance.ip_address_count

但是,我遇到了错误信息:

'dict' 对象没有属性 '_meta'

看来我找到了错误发生的原因:

Django Admin, can't groupe by: Exception Value: 'dict' object has no attribute '_meta'

但是,这并不能帮助我解决问题。

感谢您的回答。

编辑:如果我不附加 .values('ip_address),它会出错。

它不会按 ip_address 分组。它group by所有字段group by field1, field2, ip_address, ... 因此,所有情况的结果都是“1”。

最佳答案

这是您可以在本地执行的操作。 Django 知道如何处理这个问题(请参阅有关 admin and list_display 的文档)。

class LogAdmin(admin.ModelAdmin):
list_display = (..., "field1", "field2"... "quantity_of_things",)

def get_queryset(self, request):
return (super(LogAdmin, self).get_queryset(request).annotate(quantity_of_things=Count("xxxxxx")))

def quantity_of_things(self, obj):
return obj.quantity_of_things
quantity_of_things.short_description = "Number of xxxxxx"

你用你需要的任何东西来注释查询集(例如一个 Count )。如您所见,您只需使用相同的名称 3 次(在我的示例中为 quantity_of_things)

  1. 在 list_display 中(Django 理解这是一个可调用对象),
  2. 在注释中,
  3. 在要调用的函数中。
  4. quantity_of_things.short_description 用于列标题

关于带有计数注释的 django admin list_display,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53746692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com