任何人都可以解释这是怎么回事吗?来自django 1.6 ./manage.py shell
会话的成绩单:
In [7]: CoatPatternType.objects.all()
Out[7]: []
In [8]: CoatPatternType.objects.all().count()
Out[8]: 12
In [9]: CoatPatternType.objects.count()
Out[9]: 12
In [10]: CoatPatternType.objects.all()[0]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-10-ed2eaeafe12a> in <module>()
----> 1 CoatPatternType.objects.all()[0]
/usr/local/lib/python2.7/dist-packages/django/db/models/query.pyc in __getitem__(self, k)
130 qs = self._clone()
131 qs.query.set_limits(k, k + 1)
--> 132 return list(qs)[0]
133
134 def __and__(self, other):
IndexError: list index out of range
背景:
想要在我的开发环境中清理一些数据,我:
pg_dump my_db -F tar -f dbdumps/backup.tar
./manage.py dumpdata my_app --natural --indent=4 > fixture.json
./manage.py sqlsequencereset my_app | ./manage.py dbshell
的组合刷新数据。./manage.py loaddata fixture.json
恢复转储的数据。最后一步失败了
django.core.serializers.base.DeserializationError: Problem installing fixture 'fixture.json': CoatPatternType matching query does not exist.
......引导我通过上述shell会议进行调查。
在相关的CoatPatternType模型表中确实有12行,如psql中所验证的那样:
my_db=# select id from my_app_coatpatterntype;
id
----
1
2
3
4
5
6
7
8
9
10
11
12
(12 rows)
CoatPatternType是一个django-polymorphic-tree模型,如果这会产生影响。
另外,如果我没有--natural的dumpdata,loaddata命令会成功,但我不想在我的fixture中硬编码PK值,因为它最终会在其他环境中使用。
在研究这个问题时,我偶然发现了这个问题:
https://code.djangoproject.com/ticket/16773
似乎表明问题可能在于缓存计数或结果集。 connections['default'].queries
的相关最后一项是:
{u'sql': u'SELECT COUNT(*) FROM "my_app_coatpatterntype"',
u'time': u'0.001'},
{u'sql': u'SELECT "my_app_coatpatterntype"."id",
"my_app_coatpatterntype"."polymorphic_ctype_id",
"my_app_coatpatterntype"."lft", "my_app_coatpatterntype"."rght",
"my_app_coatpatterntype"."tree_id",
"my_app_coatpatterntype"."level",
"my_app_coatpatterntype"."sort_index",
"my_app_coatpatterntype"."parent_id",
"my_app_coatpatterntype"."name",
FROM "my_app_coatpatterntype" ORDER BY
"my_app_coatpatterntype"."tree_id" ASC,
"my_app_coatpatterntype"."lft" ASC LIMIT 1',
u'time': u'0.001'}
所以django似乎正在为每个查询命中数据库。
所以我的问题是,django如何在没有找到任何对象的情况下报告计数?为什么首先找不到这些物体?
答案 0 :(得分:0)
哈!当然,重新加载的对象指向的引用触发了DeserializationError(吞下了吃干酪的鼠标......)在清理过程中被删除了,因此错误是准确的和预期的。
这并没有解释count()如何返回12行但是all()当然是空的。所以,如果有人知道为什么会这样,请告诉我。