Django 管理员,无法分组:异常值:'dict' 对象没有属性“_meta”

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

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

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

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

The get_queryset method on a ModelAdmin returns a QuerySet of all model instances that can be edited by the admin site.

您实施的 queryset returns 投影, 不是 模型(包含 _meta 的东西),而是字典,因此例外。

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

如果您想使用此信息进行过滤,请查看 creating a custom filter. If you want to show this information as one of the fields in your changelist, use a callable in list_display