2017-01-16 6 views
0

Использует такие длинные запросы хороший подход? Или это должно быть сделано иначе? Это хорошо для SQL (postgres)?Правильно ли этот запрос модели Django?

goodbills = Billinfo.objects.filter(
    status=20, 
    lead_id__in=Lead.objects.filter(
     link_id__in=Link.objects.filter(
      partner=self.id, 
      landing=eachlanding 
     ).values_list('id') 
    ).values_list('id') 
).count() 
+0

показать свои модели без того, что сложно судить о связях моделей btw. – shuboy2014

ответ

1

Нет ничего плохого в длинных запросах, предоставляющих ваш прецедент, требует его, однако в вашем запросе содержится много ненужных внутренних запросов к базе данных, чтобы выяснить, что вы хотите найти с помощью __in. Вы должны иметь возможность переписать его следующим образом.

goodbills = Billinfo.objects.filter(status=20, 
            lead__link__partner=self.id, 
            lead__link__landing=eachlanding).count() 

Это устраняет необходимость извлекать объекты ссылок и объекты-ведущие (и, на мой взгляд, это упрощает понимание).

+1

Да, это работает как шарм, я должен копать глубже в документы, кажется. Еще раз спасибо. – Baks

+0

@ Бакс - не беспокойтесь, наслаждайтесь! – Sayse

0

Это, как правило, хорошая идея, чтобы сохранить ваши запросы, чтобы держать их легко читать и поддерживать, а также предотвратить двигатель базы данных от работы слишком трудно. Однако иногда вам приходится запускать сложные запросы, и вы не можете многое сделать.

Не зная вашу ERD (диаграмму отношений сущностей), сложно комментировать, как лучше структурировать этот запрос. Но, по крайней мере, я хотел бы сделать что-то вроде:

link_ids = Link.objects.filter(partner=self.id, landing=eachlanding) 
lead_id = Lead.objects.filter(link_id__in=link_ids).values_list('id')).values_list('id') 

goodbills = Billinfo.objects.filter(status=20, lead_id__in=lead_ids) 

Это убедиться, что первые два запроса не запускать каждый раз, когда вы называете запрос goodbills.