我想在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中查询它们,而不是在模型级别查询它们。我不想让我的模型比现在复杂得多。
欢迎任何建议!谢谢!