0

私はtastypieを使用してAPIを作成していますが、特定のタイプの小数の合計に注釈を付けようとして立ち往生しています。各トランザクションには関連付けられたバケット タイプがあり、バケット タイプ別にグループ化し、トランザクションを合計したいと考えています。

API リソース

class TransactionTotalResource(ModelResource):

    class Meta:
        queryset = TTransaction.objects.values('bucket').annotate(bucket_total=Sum('amount'))   
        resource_name = 'transaction_total'
        include_resource_uri = False
        allowed_methods = ['get']
        authorization= Authorization()

モデル

class TTransaction(models.Model):
    bucket = models.ForeignKey(TBucket)
    date = models.DateField()
    transaction_type_id = models.IntegerField()
    amount = models.DecimalField(null=True, max_digits=18, decimal_places=2, blank=True)
    account_id = models.IntegerField()
    recurrence_flag = models.SmallIntegerField(null=True)
    notes = models.CharField(null=True,max_length=100)
    paid = models.SmallIntegerField(null=True)
    is_credit = models.SmallIntegerField(null=True)
    reconciled = models.SmallIntegerField(null=True)
    active = models.SmallIntegerField()
    class Meta:
        db_table = u't_transaction'
        ordering = ['-date']

ターミナルから実行すると動作します。

from django.db.models import Sum
TTransaction.objects.values('bucket').annotate(bucket_total=Sum('amount'))

[{'bucket': 10, 'bucket_total': Decimal('35.24')}, {'bucket': 2, 'bucket_total': Decimal('62.00')}]

ただし、これに対して transaction_total URL をヒットすると、

{"error": "The object '{'bucket': 10, 'bucket_total': Decimal('35.24')}' has an empty attribute 'account_id' and doesn't allow a default or null value."}

すべてのモデル フィールドを「null=True」に設定すると、別のエラーが発生します。

{"error_message": "invalid literal for int() with base 10: ''", "traceback" ...

Tastypie をアノテーションで動作させる方法はありますか?

4

1 に答える 1

0

脱水法でそれを行う方法を見つけたので、これに答えると思いました:

def dehydrate(self, bundle):
    transaction = TTransaction.objects.filter(bucket_id=bundle.data['id']).values('bucket').order_by('bucket').annotate(Sum('amount'))
    bundle.data['transaction_total'] = transaction
    return bundle
于 2013-05-14T17:17:15.840 に答える