Many2Many关系中的values()是否会影响查询集?

时间:2015-06-16 10:32:21

标签: python django many-to-many django-queryset

在尝试在Many2Many关系中使用.values()时,我遇到了非常奇怪的行为。

django generic list view我致电:

(Pdb) self.get_queryset().values(u'id')
[{u'id': 16815}, {u'id': 16813}, {u'id': 16816}, {u'id': 16814}]

但是当我在多对多关系中添加特定值时,某些id消失了:

(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}
]

docs州:

  

因为ManyToManyField属性和反向关系可以有多个相关的行,包括这些行可能会对结果集的大小产生乘数效应。如果在values()查询中包含多个此类字段,这将特别明显,在这种情况下,将返回所有可能的组合。

因此我期待看到这种行为:

(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}
]

这里发生了什么?值调用是否会影响我的查询集,还是其他工作正在进行?

我检查了与我的问题相关的all the values for many to many,但他们没有看到我遇到的奇怪行为

编辑:当我输入另一个值来查询m2m以获得良好的衡量标准时,我突然将我丢失的物品丢回。我真的很困惑。

[
    {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}
]

0 个答案:

没有答案