1

私のmodels.pyには、アイテムとオファーを含む次のモデル構造があります。

class Item(models.Model):

    STATUS_CHOICES = (
        ('A', 'Active'),
        ('C', 'Cancelled'),
    ) 

    status = models.CharField(max_length=11, choices=STATUS_CHOICES)
    target_amount = models.PositiveIntegerField()
    ...

class Offer(models.Model)

    STATUS_CHOICES = (
        ('A', 'Active'),
        ('C', 'Cancelled'),
    ) 

    status = models.CharField(max_length=11, choices=STATUS_CHOICES)
    amount = models.PositiveIntegerField()
    item = models.ForeignKey(Item)
    ...

各アイテムについて以下を取得するために、views.py にクエリを記述したいと考えています。

  1. このアイテムの現在の (アクティブな) オファーの合計
  2. このアイテムのオファーによって達成された目標の割合 (つまり、[(1) の合計]/target_amount * 100)

次のように「追加」でこれを達成しようとしています(postgresを使用):

items = Item.objects.filter(status='A').extra(
    select={
        'total_amount' : 'select coalesce(sum(amount),0) from myapp_offer where myapp_offer.item_id = myapp_item.id and myapp_offer.status = \'A\'',
        'percentage_met' : '(((select coalesce(sum(amount),0) from myapp_offer where myapp_offer.item_id = myapp_item.id and myapp_offer.status = \'A\') / target_amount) * 100)'
    }
)

最初の select ( total_amount) が正しく機能し、期待どおりの結果が返されるようになりましたが、percentage_met常に 0 です。理由について誰か助けてもらえますか?

編集:percent_metでorder_byできるようにしたいと述べたはずです

4

2 に答える 2

1

これは必要ありませんextra集計を使用するだけです:

from django.db.models import Sum

items = Item.objects.filter(status='A').annotate(total_amount=Sum('offer__amount'))

percentage_metとにかく、オブジェクトごとであるため、モデルのメソッドにすぎません。

class Item(models.Model):
    ...
    @property
    def percentage_met(self):
        if hasattr(self, 'total_amount'):
            return (self.total_amount / float(self.target_amount)) * 100
        return None
于 2012-06-05T19:37:04.023 に答える
1

上記のコードは、必要な値を取得するための最もクリーンな方法ではないと思いますが、しばらくの間、あなたが見ている問題は実際にはSQLの除算の問題であると思われます- int /int は、最も近い int (この場合はゼロ) にフロア化されます。Sum は確かに int です。target_mount とは何ですか? どこから来ているのですか? それはintですか?

Postgres の場合:

select 2/100; 
?column? 
----------
        0
(1 row)

その場合、次のいずれかの値をキャストします。

select 2::numeric/100;
?column?        
------------------------
 0.02000000000000000000
(1 row)
于 2012-06-05T19:38:18.637 に答える