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

如何在Django模型中使用@property?,django,Django,我想向查询中添加一个子查询。我在事务中创建了一个@属性。在网上发现这就是我需要的。但我并不完全理解它们是如何工作的。如何使用它 views.py(查询) 型号.py paymentsss = Transaction.objects.all().select_related('currency', 'payment_source__payment_type', 'deal__service__contractor',). class PayerPaymentSource(

我想向查询中添加一个子查询。我在
事务
中创建了一个
@属性
。在网上发现这就是我需要的。但我并不完全理解它们是如何工作的。如何使用它

views.py(查询)

型号.py

paymentsss = Transaction.objects.all().select_related('currency',
       'payment_source__payment_type',
     'deal__service__contractor',).
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\u card\u details)
可以工作,但它会创建许多类似的查询。如何修复它


@property decorator只是调用property()函数的一种方便方法,该函数内置于Python中。此函数返回一个特殊值,允许直接访问方法的计算值

比如在你看来

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

obj.bank\u card\u details()
obj.bank\u card\u details
之间有什么区别?我在互联网上找到了第一个选项,它显示了我需要的数据,但它创建了许多重复的查询。第二个不创建重复项,但输出如下内容:
@fyzzzzysss似乎在您的案例中没有使用
@property
。至少是带有
@wfehr的输出看来我无意中删除了一个
@属性
,谢谢。也许这个答案会帮助你:可能是重复的