Skip to main content
 首页 » 编程设计

python之Django 测试, 'SQLCompiler' 对象没有属性 'col_count'

2025年02月15日38lidabo

我在测试什么

我正在尝试对 models.py 中的 annotate_active 查询集进行单元测试,

class ServerQuerySet(QuerySet): 
 
    def annotate_active(self, start=None, end=None): 
        return self.annotate( 
            active=Case( 
                When(fqdn__in=self.get_active_fqdns(), then=True), 
                default=False, 
                output_field=BooleanField() 
            ) 
        ) 
 
 
class Server(models.Model): 
    ... 
    objects = ServerQuerySet.as_manager() 

工作原理

get_active_fqdns 仅返回一组 fqdn 值 {'va1', 'val2', ...}

当我在 django shell 中执行查询时,一切正常:

~/Documents/piesup2 master* ⇡ 1m 15s 
venv ❯ python manage.py shell --settings=piesup2.settings.test 
 
>>> from reports.models import Server 
>>> Server.objects.annotate_active().values_list('fqdn', 'active') 
<QuerySet [('101.104.243.11', False), ('101.203.185.232', False), ('103.110.68.247', False), ('103.201.105.197', False), ('103.47.83.167', False), ('1.119.79.204', False), ('1.152.209.127', False), ('120.14.125.221', False), ('120.14.95.12', False), ('127.239.228.52', False), ('127.94.245.121', False), ('133.107.3.133', False), ('143.65.89.141', False), ('151.161.235.135', False), ('162.54.208.170', False), ('170.252.228.176', False), ('170.55.42.194', False), ('171.210.89.116', False), ('175.166.243.88', False), ('175.62.108.95', False), '...(remaining elements truncated)...']> 

未通过测试

我在 test_server.py 中有以下测试用例(我希望这个测试在断言时失败)

from django.test import TestCase 
from reports.models import Server 
 
 
class TestServerQuerySet(TestCase): 
 
    def test_annotate_active(self): 
        result = Server.objects.annotate_active().values_list('fqdn', 'active') 
        print(result) 
        self.assertTrue(False) 

但是当我运行测试时:

python manage.py test reports.tests.test_server --settings=piesup2.settings.test 

我在执行查询时得到一个 AttributeError:

Creating test database for alias 'default'... 
E 
====================================================================== 
ERROR: test_annotate_active (reports.tests.test_server.TestServerQuerySet) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
  File "/home/jwe/Documents/piesup2/reports/tests/test_server.py", line 9, in test_annotate_active 
    print(result) 
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 232, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 256, in __iter__ 
    self._fetch_all() 
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 1087, in _fetch_all 
    self._result_cache = list(self.iterator()) 
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 141, in __iter__ 
    for row in compiler.results_iter(): 
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 790, in results_iter 
    fields = [s[0] for s in self.select[0:self.col_count]] 
AttributeError: 'SQLCompiler' object has no attribute 'col_count' 
 
---------------------------------------------------------------------- 
Ran 1 test in 0.010s 
 
FAILED (errors=1) 
Destroying test database for alias 'default'... 

值得注意:

  • 测试套件的其余部分运行良好(约 140 个数据库读/写测试)
  • 示例 shell 输出使用与我的测试套件相同的 settings/test.py 文件。

在我的环境中似乎存在某种冲突,因此在运行 django 的条件 Case 查询时我的测试中断。

知道如何解决这个错误吗?

请您参考如下方法:

也许已经晚了 :) 但如果有人有同样的问题

这是一个 Django 错误,已在 1.9.1 中修复。

https://code.djangoproject.com/ticket/25894