Как добавить условие объединения в django ORM? - PullRequest
0 голосов
/ 08 ноября 2019

На самом деле мне нужно 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: с новыми правками я получил эту ошибку:

enter image description here

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')))

Этот запрос выполняет бесконечную загрузку.

...