Django get_queryset()在创建多个注释标签时遇到问题

时间:2013-11-23 14:05:56

标签: python django django-models django-admin django-queryset

我想在Django Admin中显示一些不同的注释结果。我还需要将这些新结果作为可排序列。我想出了这个(在阅读EXTENSIVELY之后):

def queryset(self, request):
    qs = super(BrandAdmin, self).get_queryset(request)
    qs = Brand.objects.annotate(
        last_connection=Max('account__computer__last_connect')
    ).filter(
        account__computer__last_connect__gte=(datetime.datetime.now() - datetime.timedelta(weeks=4))
    ).annotate(
        brand_count=Count('account__computer') 
    )            
    return qs   

def billable_computers(self, obj):
    return obj.brand_count   
billable_computers.admin_order_field = 'brand_count'

def last_connection(self, obj):
    return obj.last_connection                                                                           
last_connection.admin_order_field = 'last_connection'

这样可行,但“billable_computers”的结果非常奇怪(乘以某些因素)。我认为这是因为链式注释。

所以我尝试了这个:

def queryset(self, request):
    qs = super(BrandAdmin, self).get_queryset(request)
    qs = Brand.objects.filter(
        account__computer__last_connect__gte=(datetime.datetime.now() - datetime.timedelta(weeks=4))
    ).all().distinct().annotate(
         brand_count=Count('account__computer') 
    )           
    qss = super(BrandAdmin, self).get_queryset(request)
    qss = Brand.objects.annotate(
        last_connection=Max('account__computer__last_connect')
    )
    qs_all = qs | qss 
    return qs_all   

def billable_computers(self, obj):
    return obj.brand_count   
billable_computers.admin_order_field = 'brand_count'

def last_connection(self, obj):
    return obj.last_connection                                                                           
last_connection.admin_order_field = 'last_connection'

但这导致错误抱怨“'Brand'对象没有属性'last_connection'”。

所以我尝试了这个:

def queryset(self, request):
    qs = super(BrandAdmin, self).get_queryset(request)
    qs = Brand.objects.filter(
        account__computer__last_connect__gte=(datetime.datetime.now() - datetime.timedelta(weeks=4))
    ).annotate(
        brand_count=Count('account__computer')
    )
    qs = Brand.objects.annotate(
         last_connection=Max('account__computer__last_connect')
    )
    return qs    

但是这给“'品牌'对象没有属性'brand_count'”错误。

关于模型:计算机模型具有Account的外键,Account具有Brand的外键。计算机模型具有标记为“last_connect”的日期时间字段。每个品牌都可以拥有无​​限的账户,每个账户都可以拥有无​​限的计

我只需要记录过去4周内已连接的所有计算机(每个级别)。我还需要一个单独的(可排序的)列,用于未过滤集中所有计算机上的最新“last_connect”值。

显然我错了,但看起来应该这么简单。我需要两个不同的指标。我想在Admin中查询它们,而不是在模型级别查询它们。我不想让我的模型比现在复杂得多。

欢迎任何建议!谢谢!

0 个答案:

没有答案