I'm encountering very weird behaviour when trying to use .values() across a Many2Many relationship.
In a django generic list view I call:
(Pdb) self.get_queryset().values(u'id')
[{u'id': 16815}, {u'id': 16813}, {u'id': 16816}, {u'id': 16814}]
But when I add a particular value across a many to many relationship some id
s disappear:
(Pdb) self.get_queryset().values(u'id',u'pizza__ingredient__allergenes__id')
[
{u'pizza__ingredient__allergenes__id': 166, u'id': 16815},
{u'pizza__ingredient__allergenes__id': 37, u'id': 16815},
{u'pizza__ingredient__allergenes__id': 166, u'id': 16813},
{u'pizza__ingredient__allergenes__id': 37, u'id': 16813}
]
The docs state:
Because ManyToManyField attributes and reverse relations can have multiple related rows, including these can have a multiplier effect on the size of your result set. This will be especially pronounced if you include multiple such fields in your values() query, in which case all possible combinations will be returned.
Therefore I would expect to see this behaviour:
(Pdb)self.get_queryset().values(u'id',u'pizza__ingredient__allergenes__id')
[
{u'pizza__ingredient__allergenes__id': 166, u'id': 16815},
{u'pizza__ingredient__allergenes__id': 37, u'id': 16815},
{u'pizza__ingredient__allergenes__id': 166, u'id': 16813},
{u'pizza__ingredient__allergenes__id': 37, u'id': 16813},
{u'pizza__ingredient__allergenes__id': 166, u'id': 16814},
{u'pizza__ingredient__allergenes__id': 37, u'id': 16814},
{u'pizza__ingredient__allergenes__id': 166, u'id': 16816},
{u'pizza__ingredient__allergenes__id': 37, u'id': 16816}
]
What's going on here? Is the values call affecting my queryset, or is something else at work?
I checked all the values for many to many which is related to my question, but they are not seeing the strange behaviour I'm encountering
EDIT: When I throw in another value to query for across the m2m for good measure, I suddenly get my lost objects back. I'm really confused.
[
{u'pizza__ingredient__allergenes__name': u'Curry', u'pizza__ingredient__allergenes__id': 166, u'id': 16813},
{u'pizza__ingredient__allergenes__name': u'Tomatoe', u'pizza__ingredient__allergenes__id': 37, u'id': 16813},
{u'pizza__ingredient__allergenes__name': u'Curry', u'pizza__ingredient__allergenes__id': 166, u'id': 16814},
{u'pizza__ingredient__allergenes__name': u'Tomatoe', u'pizza__ingredient__allergenes__id': 37, u'id': 16814},
{u'pizza__ingredient__allergenes__name': u'Curry', u'pizza__ingredient__allergenes__id': 166, u'id': 16816},
{u'pizza__ingredient__allergenes__name': u'Tomatoe', u'pizza__ingredient__allergenes__id': 37, u'id': 16816},
{u'pizza__ingredient__allergenes__name': u'Curry', u'pizza__ingredient__allergenes__id': 166, u'id': 16815},
{u'pizza__ingredient__allergenes__name': u'Tomatoe', u'pizza__ingredient__allergenes__id': 37, u'id': 16815}
]