Django admin:如何通过自定义方法对列进行排序
Posted
技术标签:
【中文标题】Django admin:如何通过自定义方法对列进行排序【英文标题】:Django admin: how to sort column by custom method 【发布时间】:2013-04-02 09:04:20 【问题描述】: class Item(models.Model):
name = models.CharField(max_length=100, unique=True)
def admin_amount(self):
total = self.warehouse_set.all().aggregate(item=Sum('amount'))
return total['item']
class Warehouse(models.Model):
name = models.CharField(max_length=100, unique=True)
item = models.ForeignKey('Item', blank=True, null=True)
amount = models.IntegerField()
创建新字段是错误的,但我不能这样做:
admin_amount.admin_order_field = 'admin_amount'
我找到了similar question,但我遇到了重写queryset() 方法的问题(不能写qs.warehouse_set.all().annotate(models.Sum('amount'))
之类的东西)。有没有办法为我调整这个解决方案,或者就我而言,还有另一种解决方案?
【问题讨论】:
【参考方案1】:使用the linked question(和suggested edit)中的代码,底部应该为您的示例执行此操作。原理是使用annotate将子查询中的附加数据添加到返回的QuerySet中。在这种情况下,Sum
是仓库中的金额。
接下来,您添加一个包装函数 amount_in_warehouses
以获取每一行的此值,并告诉管理员在列表中显示此值 list_display = ('amount_in_warehouses',)
,并对其进行排序 amount_in_warehouses.admin_order_field = 'amount_in_warehouses'
。
class ItemAdmin(admin.ModelAdmin):
list_display = ('amount_in_warehouses',)
name = models.CharField(max_length=100, unique=True)
def queryset(self, request):
qs = super(ItemAdmin, self).queryset(request)
qs = qs.annotate(models.Sum('warehouse__amount'))
return qs
def amount_in_warehouses(self, obj):
return obj.warehouse__amount__sum
amount_in_warehouses.admin_order_field = 'amount_in_warehouses'
【讨论】:
以上是关于Django admin:如何通过自定义方法对列进行排序的主要内容,如果未能解决你的问题,请参考以下文章