我有一些复杂的查询需要.extra()函数:
contractors = models.Contractor.objects\
.filter(is_authorized=True, user__is_active=True,
categories=cat,
globalcontractorrank__isnull=False)\
.exclude(user__name='')\
.extra(
select={'fullrank':
'COALESCE(ranking_subcategorycontractorrank.points, 0) + '
'ranking_globalcontractorrank.points'},
tables=['ranking_subcategorycontractorrank'],
where=['ranking_subcategorycontractorrank.category_id IS NULL OR '
'ranking_subcategorycontractorrank.category_id = %d' % cat.pk])\
.order_by('-fullrank', '-subcategorycontractorrank__points', '-user__registered_on')
这会产生非常意外的结果:
In [19]: contractors.count()
Out[19]: 0
In [20]: len(contractors)
Out[20]: 900
In [21]: contractors.count()
Out[21]: 900
似乎django编译器以一种给出不同结果的方式简化了COUNT()查询的SQL。但是,一旦以原始格式运行查询,结果就会被缓存,后续的COUNT()查询将返回正确的匹配数。
这种行为是对的还是我应该提交错误?