Django Admin,无法分组:异常值:'dict' 对象没有属性'_meta'

Posted

技术标签:

【中文标题】Django Admin,无法分组:异常值:\'dict\' 对象没有属性\'_meta\'【英文标题】:Django Admin, can't groupe by: Exception Value: 'dict' object has no attribute '_meta'Django Admin,无法分组:异常值:'dict' 对象没有属性'_meta' 【发布时间】:2015-04-23 17:13:12 【问题描述】:

我有这个映射到 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

【问题讨论】:

我怀疑这个异常背后有错误,没有被接受code.djangoproject.com/ticket/24387 【参考方案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

以上是关于Django Admin,无法分组:异常值:'dict' 对象没有属性'_meta'的主要内容,如果未能解决你的问题,请参考以下文章

在 django admin 中按天分组?

django运行django-admin.py无法创建网站

在没有 django.contrib.admin 的情况下运行 django 应用程序

Django Admin Cookbook-38如何获取特定对象的Django Admin后台URL

win7下,使用django运行django-admin.py无法创建网站

在Django admin中保存时捕获异常?