【发布时间】:2015-10-29 18:49:39
【问题描述】:
谁能解释这怎么可能?来自 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 的情况下转储数据,则 loaddata 命令会成功,但我不想在我的夹具中硬编码 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 如何在没有找到任何对象的情况下报告计数?为什么一开始就找不到对象?
【问题讨论】:
标签: python django database postgresql polymorphism