16
 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'

同様の質問を見つけましたが、 queryset() メソッドの書き換えで問題が発生しました ( のようなものを書くことはできませんqs.warehouse_set.all().annotate(models.Sum('amount')))。この解決策を私に適応させる方法はありますか、または私の場合、別の解決策がありますか?

4

1 に答える 1

21

リンクされた質問(および提案された編集)のコードを使用して、例の下部でそれを行う必要があります。原則は、注釈を使用して、サブクエリから返された 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'
于 2013-04-10T20:17:14.987 に答える