Django对象计数为非零,在删除多态mod之后没有对象

2024-07-04 09:12:38 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释一下这是怎么可能的吗?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

背景:

想要清理开发环境中的一些数据,我:

  1. pg_dump my_db -F tar -f dbdumps/backup.tar备份数据库
  2. 通过./manage.py dumpdata my_app --natural --indent=4 > fixture.json转储所需的数据
  3. 通过模型删除和./manage.py sqlsequencereset my_app | ./manage.py dbshell组合刷新数据。你知道吗
  4. 试图通过./manage.py loaddata fixture.json还原转储的数据。你知道吗

最后一步失败

django.core.serializers.base.DeserializationError: Problem installing fixture 'fixture.json': CoatPatternType matching query does not exist.

…引导我通过上述空壳会议进行调查。你知道吗

相关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多态树模型,如果有区别的话。你知道吗

另外,如果我在没有--natural的情况下转储数据,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怎么能在没有发现任何物体的情况下报告一个计数呢?为什么一开始就找不到这些东西?你知道吗


Tags: 数据djangoinpyidappdbobjects
1条回答
网友
1楼 · 发布于 2024-07-04 09:12:38

哈!当然,被重新加载的对象所指向的引用触发了反序列化错误(吞下了吃奶酪的鼠标…)在清理过程中被删除了,所以这个错误是准确的和预期的。你知道吗

这并不能解释count()如何返回12行,但是all()当然是空的。所以如果有人知道为什么会这样,请告诉我。你知道吗

相关问题 更多 >

    热门问题