1

2 つの異なるモデルから共通のフィールドを返す単一の Tastypie リソースを作成したいと考えています。

次のように記述されたモデルがあります。

Class Invoice(models.Model):
    transaction_batch = models.ForeignKey(TransactionBatch)
    invoice_number = models.IntegerField()
    subtotal = models.DecimalField(max_digits=20, decimal_places=2)
    tax = models.DecimalField(max_digits=20, decimal_places=2)
    total = models.DecimalField(max_digits=20, decimal_places=2)
    location = models.ForeignKey(Delivery_location)
    date_time = models.DateTimeField()

Class Payment(models.Model):
    transaction_batch = models.ForeignKey(TransactionBatch)
    location = models.ForeignKey(Delivery_location)
    payment_id = models.IntegerField(pk=True)
    datetime = models.DateTimeField()
    amount = models.DecimalField(max_digits=20, decimal_places=2)
    payment_method = models.IntegerField(choices = PAYMENT_METHOD_CHOICES)

そして、次のフィールドを持つリソースを作成したいと思います:

Class TransactionResource(Resource):
    type = fields.CharField() #"invoice" or "payment"
    id = fields.CharField(attribute='name') #invoice_number or payment_id
    location = fields.ForeignKey(LocationResource)
    total = fields.IntegerField(attribute='total', null=True) #total or amount
    datetime = fields.DateField()

フィールド名が直接一致しないため、Model フィールドを Resource フィールドにマップする方法が必要になります。たとえば、リソース ID フィールドは、Invoices の場合は invoice_number、Payments の場合は payment_id になります。

これについて最善の方法は何ですか?

4

1 に答える 1

1

ModelResource から継承したくない場合は、dehydrate メソッドを使用して値を追加できます。

class TransactionResource(Resource):
    type = fields.CharField() #"invoice" or "payment"
    id = fields.CharField(attribute='name') #invoice_number or payment_id
    location = fields.ForeignKey(LocationResource)
    total = fields.IntegerField(attribute='total', null=True) #total or amount
    datetime = fields.DateField()

    # Add values in dehydrate
    def dehydrate(self, bundle):
        bundle.data['some_invoide_value'] = invoice.value
        bundle.data['some_payment_value'] = payment.value
        return super(TransactionResource, self).dehydrate(bundle)
于 2012-10-05T19:58:05.877 に答える