Django查询返回对象,但.count()报告0

时间:2016-05-25 20:00:49

标签: python sql django

我有一些复杂的查询需要.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()查询将返回正确的匹配数。

这种行为是对的还是我应该提交错误?

0 个答案:

没有答案