На самом деле мне нужно self join
с условием. Но никто не ответил мне на этот вопрос ( мой вопрос ), поэтому я решил использовать две идентичные модели. Мне нужно добавить условие AND
при соединении следующим образом:
LEFT OUTER JOIN "processing"."payer_payment_source" T7
ON ("processing"."payer_payment_source"."payer_id" = T7."payer_id" AND "T7."payment_type_id" = 'bank_card_details)
views.py
paymentsss = Transaction.objects.all().annotate(payment_type=FilteredRelation('payment_source_t', condition=Q(
payment_source__payment_type='bank_card_details')))
Я хочу добавить:
"T7."payment_type_id" = 'bank_card_details
models.py
class PayerPaymentSource1(models.Model):
payer_id = models.BigIntegerField(blank=True, null=False, primary_key=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 PayerPaymentSource(models.Model):
id = models.BigIntegerField(blank=True, null=False, primary_key=True)
payer = models.ForeignKey(PayerPaymentSource1, blank=True, null=True, on_delete=models.CASCADE)
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, related_name='payment_source_t')
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)
class Meta:
managed = False
db_table = '"processing"."transaction"'
Как я могу это сделать?
UPD: с новыми правками я получил эту ошибку:
UPD2: paymentsss = Transaction.objects.all().select_related('currency',
'payment_source__payment_type',
'deal__service__contractor',).annotate(
payment_type_kkk=FilteredRelation('payment_source', condition=Q(
payment_source__payment_type_id='bank_card_details')))
Этот запрос выполняет бесконечную загрузку.