Как выбрать конкретные таблицы из связанных таблиц (Django)? - PullRequest
1 голос
/ 30 октября 2019

У меня есть запрос, который связывает пять таблиц. В некоторых из них мне нужно одно (name из contractor) поле. Поэтому я хочу оптимизировать это и выбрать только одно поле), а не всю таблицу. Как я могу отредактировать этот код?

    paymentsss = Transaction.objects.all().select_related('currency', 
'payment_source__payment_type', 'deal__service','deal__service__contractor')

Превращается в

SELECT "processing"."transaction"."id", 
       "processing"."transaction"."currency_id", 
       "processing"."transaction"."deal_id", 
       "processing"."transaction"."service_instance_id", 
       "processing"."transaction"."payment_source_id", 
       "processing"."transaction"."payment_date", 
       "processing"."transaction"."amount", 
       "processing"."transaction"."status", 
       "processing"."transaction"."context", 
       "processing"."currency"."id", 
       "processing"."currency"."name", 
       "processing"."currency"."iso_name", 
       "processing"."currency"."minor_unit", 
       "processing"."deal"."id", 
       "processing"."deal"."service_id", 
       "processing"."deal"."currency_id", 
       "processing"."deal"."adapter_account_id", 
       "processing"."deal"."amounts_rule", 
       "processing"."deal"."comission_rule", 
       "processing"."deal"."weight_rule", 
       "processing"."deal"."active", 
       "processing"."deal"."provider_enabled", 
       "processing"."deal"."min_amount", 
       "processing"."deal"."max_amount", 
       "processing"."deal"."payment_types", 
       "processing"."deal"."params", 
       "processing"."deal"."contractor_params", 
       "processing"."deal"."tags", 
       "processing"."service"."id", 
       "processing"."service"."flow_id", 
       "processing"."service"."currency_id", 
       "processing"."service"."contractor_id", 
       "processing"."service"."amount", 
       "processing"."service"."callback_url", 
       "processing"."service"."definition", 
       "processing"."service"."name", 
       "processing"."service"."description", 
       "processing"."service"."charge_strategy", 
       "processing"."service"."routine", 
       "processing"."service"."tags", 
       "processing"."contractor"."id", 
       "processing"."contractor"."name", 
       "processing"."contractor"."inn", 
       "processing"."contractor"."kpp", 
       "processing"."contractor"."bank_reg_id", 
       "processing"."contractor"."bank_reg_date", 
       "processing"."contractor"."slug", 
       "processing"."contractor"."uuid", 
       "processing"."contractor"."is_nds_payer", 
       "processing"."contractor"."tag", 
       "processing"."payer_payment_source"."id", 
       "processing"."payer_payment_source"."payer_id", 
       "processing"."payer_payment_source"."payment_type_id", 
       "processing"."payer_payment_source"."source_details", 
       "processing"."payment_type"."id", 
       "processing"."payment_type"."name", 
       "processing"."payment_type"."group_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") 
 ORDER BY "processing"."transaction"."id" DESC

Что я хочу удалить

Я выделил красным эти столбцычто я хотел удалить.

Некоторые модели из models.py

class Contractors(models.Model):
    id = models.IntegerField(blank=True, null=False, primary_key=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    inn = models.CharField(max_length=14, blank=True, null=True)
    kpp = models.CharField(max_length=14, blank=True, null=True)
    bank_reg_id = models.CharField(max_length=255, blank=True, null=True)
    bank_reg_date = models.DateField(blank=True, null=True)
    slug = models.CharField(max_length=255, blank=True, null=True)
    uuid = models.CharField(max_length=36, blank=True, null=True)
    is_nds_payer = models.BooleanField(blank=True, null=True)
    tag = models.TextField(blank=True, null=True)  # This field type is a guess.

    class Meta:
        managed = False
        db_table = '"processing"."contractor"'


class PaymentType(models.Model):
    id = models.CharField(max_length=75, blank=True, null=False, primary_key=True)
    name = models.CharField(max_length=128, blank=True, null=True)
    group_name = models.CharField(max_length=64, blank=True, null=True)

    class Meta:
        managed = False
        db_table = '"processing"."payment_type"'


class Service(models.Model):
    id = models.IntegerField(db_index=True, blank=True, null=False, primary_key=True)
    flow_id = models.IntegerField(blank=True, null=True)
    currency_id = models.SmallIntegerField(blank=True, null=True)
    contractor = models.ForeignKey(Contractors, blank=True, null=True, on_delete=models.CASCADE)
    amount = models.IntegerField(blank=True, null=True)
    callback_url = models.CharField(max_length=128, blank=True, null=True)
    definition = models.TextField(blank=True, null=True)  # This field type is a guess.
    name = models.CharField(max_length=255, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    charge_strategy = models.CharField(max_length=64, blank=True, null=True)
    routine = models.TextField(blank=True, null=True)  # This field type is a guess.
    tags = models.TextField(blank=True, null=True)  # This field type is a guess.

    class Meta:
        managed = False
        db_table = '"processing"."service"'

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

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вы можете использовать defer, чтобы не загружать поля из связанных моделей: https://docs.djangoproject.com/en/2.2/ref/models/querysets/#defer

Таким образом, (не полная) модификация вашего запроса для удаления названия валюты:

 paymentsss = Transaction.objects.all().select_related('currency', 'payment_source__payment_type', 'deal__service','deal__service__contractor').defer('currency__name')
0 голосов
/ 31 октября 2019

Я решил это, просто удалив ненужные поля из модели.

...