Feature request: make it possible to "tell" filter that would result a join, to add an additional condition to that join
Consider the following models: Country: name # CharField slug # SlugField Topic: name # CharField slug # SlugField Project: name # CharField slug # SlugField topic = ForeignKey(Topic) budget # IntegerField ProjectLocation project = ForeignKey(Project) country = ForeignKey(Country) latitude # DecimalField longitude # DecimalField I want to calculate total amounts per country for projects that are located in certain countries. If I do so, finally filtering on Country.slug, I also get totals for countries that aren't in the selection. The produced query is similar to the following: SELECT DISTINCT `website_country`.`name`, `website_country`.`slug`, SUM(`website_project`.`budget`) AS `total_budget` FROM `website_project` LEFT OUTER JOIN `website_projectlocation` ON (`website_project`.`id` = `website_projectlocation`.`project_id`) LEFT OUTER JOIN `website_country` ON (`website_projectlocation`.`country_id` = `website_country`.`id`) INNER JOIN `website_topic` ON (`website_project`.`topic_id` = `website_topic`.`id`) INNER JOIN `website_projectlocation` T7 ON (`website_project`.`id` = T7.`project_id`) INNER JOIN `website_country` T8 ON (T7.`country_id` = T8.`id`) WHERE (`website_topict`.`slug` IN ("child-education") AND T8.`iso2` IN ("MY", "BI", "MW")) GROUP BY `website_country`.`name`, `website_country`.`slug` ORDER BY NULL When I change the query to the following it works as needed: SELECT DISTINCT `website_country`.`name`, `website_country`.`slug`, SUM(`website_project`.`budget`) AS `total_budget` FROM `website_project` LEFT OUTER JOIN `website_projectlocation` ON (`website_project`.`id` = `website_projectlocation`.`project_id`) LEFT OUTER JOIN `website_country` ON (`website_projectlocation`.`country_id` = `website_country`.`id` AND `website_country`.`iso2` IN ("MY", "BI", "MW")) INNER JOIN `website_topic` ON (`website_project`.`topic_id` = `website_topic`.`id`) INNER JOIN `website_projectlocation` T7 ON (`website_project`.`id` = T7.`project_id`) INNER JOIN `website_country` T8 ON (T7.`country_id` = T8.`id`) WHERE (`website_topict`.`slug` IN ("child-education") AND T8.`iso2` IN ("MY", "BI", "MW")) GROUP BY `website_country`.`name`, `website_country`.`slug` ORDER BY NULL Thus, it would be great to be able to tell somewhere in the filtering that certain filter should be applied also as additional statement for the appropriate JOIN. For example, instead of: Project.filter(projectlocation__country__slug__in=['MY', 'BI', 'MW']) the following Project.filter(projectlocation__country__slug__in=['MY', 'BI', 'MW'], use_in_joins=True) -- You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscr...@googlegroups.com. To post to this group, send email to django-developers@googlegroups.com. Visit this group at http://groups.google.com/group/django-developers. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/7338cb81-7ae7-4690-88f8-6c52a760f9c1%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.