Снижает ли обработка значения поля вложенного отношения FK производительность?

У меня есть различные модели, которые связаны между собой через отношения иностранных ключей, влияет ли это на производительность. Я хочу знать, как django выполняет это внутренне.

PriceSheet.objects.select_related('query').filter(id=pricesheet_id).values('query__campaign_name',
                                                                            'query_id',
                                                                            'query__campaign_status',
                                                                            'query__lead_id',
                                                                            'query__lead__legal_name',
                                                                            'query__lead__brand_name' # nested
                                                                            'query__lead__working_capital',
                                                                            'query__lead__payment_terms',
                                                                            
                                                                            )  # 7


Вы можете проверить запрос, напечатав:

print(queryset.query)

В этом случае Django выведет запрос, который он сделает. В данном случае запрос будет выглядеть так:

SELECT query.campaign_name, price_sheet.id, query.campaign_status,
       query.lead_id, lead.legal_name, lead.brand_name,
       lead.working_capital, lead.payment_terms
FROM price_sheet
LEFT OUTER JOIN query ON query.id = price_sheet.query_id
LEFT OUTER JOIN lead ON lead.id = query.lead_id
WHERE price_sheet.id = pricesheet_id

Django will thus make JOINs on the models referenced by the query and by the lead of the query. Using .select_related(…) [Django-doc] to force a JOIN is not necessary in this case.

Обычно лучше не работать с .values(…) [Django-doc], когда вы хотите преобразовать данные в JSON-блоб, поскольку это разрушает логический слой, который обеспечивает модель(и). Например, для поля с выбором вы больше не сможете (легко) получить доступ к отображаемому имени и т.д.

Вернуться на верх