0

私は Django を初めて使用し、tastypie を使用して単純な API を作成しようとしています。あるリソースから別のリソースに関連する情報を表示する適切な方法がわかりません。

モデル.py

class TBucket(models.Model):
    name = models.CharField(max_length=50)
    bucket_type = models.IntegerField()
    bucket_seed = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    class Meta:
        db_table = u't_bucket'
        ordering = ['name']

class TTransaction(models.Model):
    bucket = models.ForeignKey(Tbucket)
    date = models.DateTimeField()
    amount = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    account = models.IntegerField()

api.py (スニペット)

class BucketResource(ModelResource): 
    class Meta:
        queryset = TBucket.objects.all()
        resource_name = 'bucket'
        include_resource_uri = False
        allowed_methods = ['get','post','put','delete']
        authorization = Authorization()

class TransactionResource(ModelResource):
    bucket_name = fields.ToOneField(BucketResource, 'name', null=True)

    class Meta:
        queryset = TTransaction.objects.all()
        resource_name = 'transaction'
        include_resource_uri = False
        allowed_methods = ['get','post','put','delete']
        authorization= Authorization()

DB 内のレコードは次のようになります。

t_bucket
id:1, name:Food, bucket_type:1, bucket_seed:50.00
id:2, name:Gas, bucket_type:1, bucket_seed:25.00

t_transaction:
id:5, bucket_id:1, date:2013-03-31, amount:8.75, account:1
id:6, bucket_id:2, date:2013-04-01, amount:25.50, account:1

トランザクション URL にアクセスすると、[{"id": 1, "bucket_name":null, "date":2013-03-31, "amount":8.75, "account":1},{. ..]

バケットテーブルでルックアップを実行して「名前」を取得し、JSON 応答で返すようにするにはどうすればよいですか?

ありがとう

4

1 に答える 1

0

ToOneField は、名前だけでなく BucketResource オブジェクト全体を表示します。属性 param を 'name' に指定したため、null が表示されますが、TBucket モデルを指す TTransaction モデルのフィールドである必要があります。あなたの場合、次のようになります。

bucket = fields.ToOneField(BucketResource, 'bucket', null=True)

しかし、私が言ったように、BucketResource 全体が表示されます。TBucket モデルからの名前だけが必要な場合は、dehydrate メソッドをオーバーライドできます。

def dehydrate(self, bundle):
    bundle.data['bucket_name'] = bundle.obj.bucket.name

そして、この方法でbucket_nameのみが表示されます

于 2013-05-06T10:55:19.497 に答える