如何在Django模型中使用@property?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Django模型中使用@property?相关的知识,希望对你有一定的参考价值。

我想在查询中添加一个子查询。然后在@property中创建了一个Transaction。在互联网上发现这就是我所需要的。但是我不完全了解它们是如何工作的。如何使用?

views.py(Query)

paymentsss = Transaction.objects.all().select_related('currency',
       'payment_source__payment_type',
     'deal__service__contractor',).

models.py

class PayerPaymentSource(models.Model):
    id = models.BigIntegerField(blank=True, null=False, primary_key=True)
    payer_id = models.BigIntegerField(blank=True, null=True)
    payment_type = models.ForeignKey(PaymentType, max_length=64, blank=True, null=True, on_delete=models.CASCADE)
    source_details = models.TextField(blank=True, null=True)  # This field type is a guess.

    class Meta:
        managed = False
        db_table = '"processing"."payer_payment_source"'


class Transaction(models.Model):
    id = models.BigIntegerField(blank=True, null=False, primary_key=True)
    currency = models.ForeignKey(Currency, null=True, on_delete=models.CASCADE)
    deal = models.ForeignKey(Deal, null=True, on_delete=models.CASCADE)
    # service_instance = models.ForeignKey(ServiceInstance, null=True, on_delete=models.CASCADE)
    payment_source = models.ForeignKey(PayerPaymentSource, null=True, on_delete=models.CASCADE)
    payment_date = models.DateTimeField(blank=True, null=True)
    amount = models.IntegerField(blank=True, null=True)
    status = models.CharField(max_length=255, blank=True, null=True)
    context = models.TextField(blank=True, null=True)

    @property
    def bank_card_details(self):
        return PayerPaymentSource.objects.filter(self.payment_source.source_details,
                                                 payment_type='bank_card_details')

    class Meta:
        managed = False
        db_table = '"processing"."transaction"'

UPD:print(payment.bank_card_details)有效,但它会创建许多类似的查询。如何解决?

enter image description here

答案

@ property装饰器只是调用内置在Python中的property()函数的便捷方法。该函数返回一个特殊的descriptor object,它可以直接访问该方法的计算值。

例如您的观点

obj = Transaction.objects.get(pk=pk)
#now you can get the bank_card_details like this:
print(obj.bank_card_details)

以上是关于如何在Django模型中使用@property?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使 @cached_property 无效

如何在 Django 中预取聚合的@property?

如何在 django 中声明和调用在关系中导航的模型方法?

如何使用 DJango Rest Framework 上传多个图像?

将迁移应用到 Django Flatpage 模型

使用 django_property_filter 但 PropertyChoiceFilter 在 Inactive 上无法匹配