如何在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的输出看来我无意中删除了一个@属性
,谢谢。也许这个答案会帮助你:可能是重复的