【问题标题】:Django Admin, can't groupe by: Exception Value: 'dict' object has no attribute '_meta'Django Admin,无法分组:异常值:'dict' 对象没有属性'_meta'
【发布时间】:2024-04-25 19:15:02
【问题描述】:

我有这个映射到 postgresql 视图的模型

class AppModel(models.Model):

    nbr = models.BigIntegerField(blank=True, null=True)
    region = models.ForeignKey(AppWilaya,blank=True, null=True)
    date_preorder = models.DateField(blank=True, null=True)
    id = models.IntegerField(primary_key=True,blank=True, db_column='dummy_id')

我想要实现的是将 "nbr""region" 相加,所以:

class AppModelAdmin(admin.ModelAdmin):
....
def queryset(self, request):
        qs = super(AppModelAdmin, self).get_queryset(request)  
        qs=qs.values("region").annotate(total=Sum( 'nbr'))

但 Django Admin 似乎不接受 .values("region") 作为抛出异常:

Exception Value: 'dict' object has no attribute '_meta'
Exception Location: [PATH_TO]\lib\site-packages\django\contrib\admin\util.py in lookup_field, line 242

【问题讨论】:

标签: python-3.x django-admin django-queryset


【解决方案1】:

首先,您使用的是 Django 1.6,它将 queryset 的使用更改为 get_queryset。因此,为防止任何混淆,只需使用 get_queryset 或完全使用不同的名称(如果这不是您想要的)。

ModelAdmin 中的get_queryset 方法在documentation(强调我的)中有以下描述:

ModelAdmin 上的 get_queryset 方法返回一个由管理站点编辑的所有模型实例组成的 QuerySet。

您的queryset 实现返回一个投影,它不是 模型(包含_meta 的东西),而是一个字典,因此例外。

因此,这不是您的查询本身的问题,而是您在哪里使用它的问题。 get_queryset 方法不适合做你想做的事。

如果您想使用此信息进行过滤,请查看creating a custom filter。如果您想将此信息显示为更改列表中的字段之一,use a callable in list_display

【讨论】:

  • 如果 get_queryset 方法不正确,那么如何在管理列表中显示利用过滤器功能的分组数据?
  • 你不能使用 callable 在一组模型实例上实现 aggregation
  • 不适用于任意集合,不。如果您希望您的聚合完成(例如)当前的更改列表选择,恐怕您将不得不考虑扩展管理模板并从那里调用自定义方法。请记住:管理员不是您的应用程序! *.com/a/677509/1636314