I did some more investigations and seems I have found a bug probably
related to
http://groups.google.com/group/django-developers/browse_thread/thread/53c9d7d877c318bd.
This is 100% bug.
The example below uses same models as in previous post.
print
LocalNumber.objects.filter(subscription__account=self)._get_sql_clause()
And here is the result:
(['`provider_localnumber`.`id`', '`provider_localnumber`.`pool_id`',
'`provider_localnumber`.`sub_pool_id`',
'`provider_localnumber`.`number`'], ' FROM `provider_localnumber` LEFT
OUTER JOIN `billing_subscription` AS
`m2m_provider_localnumber__subscription` ON
`provider_localnumber`.`id` =
`m2m_provider_localnumber__subscription`.`object_id` INNER JOIN
`billing_subscription` AS `provider_localnumber__subscription` ON
`m2m_provider_localnumber__subscription`.`object_id` =
`provider_localnumber__subscription`.`id` WHERE
(`provider_localnumber__subscription`.`account_id` = %s)', [20865L])
Please note the inner join
m2m_provider_localnumber__subscription`.`object_id` =
`provider_localnumber__subscription`.`id` - IT MUST BE object_id not
id!!!
For example, if we run this SQL we get no result:
mysql> select `provider_localnumber`.`id`,
`provider_localnumber`.`pool_id`,
`provider_localnumber`.`sub_pool_id`, `provider_localnumber`.`number`
FROM `provider_localnumber` LEFT OUTER JOIN `billing_subscription` AS
`m2m_provider_localnumber__subscription` ON
`provider_localnumber`.`id` =
`m2m_provider_localnumber__subscription`.`object_id` INNER JOIN
`billing_subscription` AS `provider_localnumber__subscription` ON
`m2m_provider_localnumber__subscription`.`object_id` =
`provider_localnumber__subscription`.`id` WHERE
(`provider_localnumber__subscription`.`account_id` = 20865);
Empty set (0.00 sec)
BUT IF WE CHANGE `provider_localnumber__subscription`.`id` to
`provider_localnumber__subscription`.`object_id` WE DO GET CORRECT
RESULT:
mysql> select `provider_localnumber`.`id`,
`provider_localnumber`.`pool_id`,
`provider_localnumber`.`sub_pool_id`, `provider_localnumber`.`number`
FROM `provider_localnumber` LEFT OUTER JOIN `billing_subscription` AS
`m2m_provider_localnumber__subscription` ON
`provider_localnumber`.`id` =
`m2m_provider_localnumber__subscription`.`object_id` INNER JOIN
`billing_subscription` AS `provider_localnumber__subscription` ON
`m2m_provider_localnumber__subscription`.`object_id` =
`provider_localnumber__subscription`.`object_id` WHERE
(`provider_localnumber__subscription`.`account_id` = 20865);
+-------+---------+-------------+--------+
| id | pool_id | sub_pool_id | number |
+-------+---------+-------------+--------+
| 46317 | 13 | 1 | 1000 |
| 46337 | 13 | 2 | 1020 |
+-------+---------+-------------+--------+
2 rows in set (0.00 sec)