Как использовать @property в моделях Django? - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу добавить один подзапрос к моему запросу. И я создал @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

1 Ответ

0 голосов
/ 07 ноября 2019

Декоратор @property - это просто удобный способ вызова функции property (), встроенной в Python. Эта функция возвращает специальный объект дескриптора , который обеспечивает прямой доступ к вычисленному значению метода.

Например, на ваш взгляд

obj = Transaction.objects.get(pk=pk)
#now you can get the bank_card_details like this:
print(obj.bank_card_details)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...