Я хочу сделать самостоятельное соединение для объединенной таблицы.
У меня есть набор запросов:
paymentsss = Transaction.objects.all().select_related('currency',
'payment_source__payment_type','deal__service',
'deal__service__contractor').order_by('-id')
, который преобразуется в:
SELECT "processing"."transaction"."id",
"processing"."transaction"."currency_id",
"processing"."transaction"."deal_id",
"processing"."transaction"."payment_source_id",
"processing"."transaction"."payment_date",
"processing"."transaction"."amount",
"processing"."transaction"."status",
"processing"."transaction"."context",
"processing"."currency"."id",
"processing"."currency"."iso_name",
"processing"."currency"."minor_unit",
"processing"."deal"."id",
"processing"."deal"."service_id",
"processing"."deal"."currency_id",
"processing"."service"."id",
"processing"."service"."contractor_id",
"processing"."service"."name",
"processing"."service"."description",
"processing"."contractor"."id",
"processing"."contractor"."name",
"processing"."payer_payment_source"."id",
"processing"."payer_payment_source"."payment_type_id",
"processing"."payer_payment_source"."source_details",
"processing"."payment_type"."id",
"processing"."payment_type"."name"
FROM "processing"."transaction"
LEFT OUTER JOIN "processing"."currency"
ON ("processing"."transaction"."currency_id" = "processing"."currency"."id")
LEFT OUTER JOIN "processing"."deal"
ON ("processing"."transaction"."deal_id" = "processing"."deal"."id")
LEFT OUTER JOIN "processing"."service"
ON ("processing"."deal"."service_id" = "processing"."service"."id")
LEFT OUTER JOIN "processing"."contractor"
ON ("processing"."service"."contractor_id" = "processing"."contractor"."id")
LEFT OUTER JOIN "processing"."payer_payment_source"
ON ("processing"."transaction"."payment_source_id" = "processing"."payer_payment_source"."id")
LEFT OUTER JOIN "processing"."payment_type"
ON ("processing"."payer_payment_source"."payment_type_id" = "processing"."payment_type"."id")
Этофрагмент из таблицы payment_source
. Поля, содержащие bank_card
, объединены с Transaction
, но bank_card_details
нет. У них одинаковые payer_id
. Необходимо, чтобы эти две строки были объединены в одну. Как я могу это сделать?
![enter image description here](https://i.stack.imgur.com/vQw3m.png)
Models.py
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)
class Meta:
managed = False
db_table = '"processing"."transaction"'
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"'
UPD: основано на наборе запросов django, Iизменил запрос, чтобы он соответствовал моим целям (затронуты только последние 3 строки). Как передать его в Django ORM? Мне это нужно, потому что в Django ORM удобные фильтры для поиска.
SELECT "processing"."transaction"."id",
"processing"."transaction"."currency_id",
"processing"."transaction"."deal_id",
"processing"."transaction"."payment_source_id",
"processing"."transaction"."payment_date",
"processing"."transaction"."amount",
"processing"."transaction"."status",
"processing"."transaction"."context",
"processing"."currency"."id",
"processing"."currency"."iso_name",
"processing"."currency"."minor_unit",
"processing"."deal"."id",
"processing"."deal"."service_id",
"processing"."deal"."currency_id",
"processing"."service"."id",
"processing"."service"."contractor_id",
"processing"."service"."name",
"processing"."service"."description",
"processing"."contractor"."id",
"processing"."contractor"."name",
"ps"."id",
"ps"."payment_type_id",
"ps"."source_details",
"processing"."payment_type"."id",
"processing"."payment_type"."name",
"psc"."source_details"
FROM "processing"."transaction"
LEFT OUTER JOIN "processing"."currency" ON ("processing"."transaction"."currency_id" = "processing"."currency"."id")
LEFT OUTER JOIN "processing"."deal" ON ("processing"."transaction"."deal_id" = "processing"."deal"."id")
LEFT OUTER JOIN "processing"."service" ON ("processing"."deal"."service_id" = "processing"."service"."id")
LEFT OUTER JOIN "processing"."contractor" ON ("processing"."service"."contractor_id" = "processing"."contractor"."id")
LEFT OUTER JOIN "processing"."payer_payment_source" AS "ps" ON ("processing"."transaction"."payment_source_id" = "ps"."id")
LEFT OUTER JOIN "processing"."payment_type" ON ("ps"."payment_type_id" = "processing"."payment_type"."id")
LEFT OUTER JOIN "processing"."payer_payment_source" AS "psc" ON ("ps"."payer_id" = "psc"."payer_id") AND "psc"."payment_type_id" = 'bank_card_details'