Django对象计数不为零,多态模型删除后没有对象

时间:2015-08-06 14:45:28

标签: python django database postgresql polymorphism

任何人都可以解释这是怎么回事吗?来自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. 备份数据库
  3. 通过./manage.py dumpdata my_app --natural --indent=4 > fixture.json
  4. 转出所需数据
  5. 通过模型删除和./manage.py sqlsequencereset my_app | ./manage.py dbshell的组合刷新数据。
  6. 尝试通过./manage.py loaddata fixture.json恢复转储的数据。
  7. 最后一步失败了

    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如何在没有找到任何对象的情况下报告计数?为什么首先找不到这些物体?

1 个答案:

答案 0 :(得分:0)

哈!当然,重新加载的对象指向的引用触发了DeserializationError(吞下了吃干酪的鼠标......)在清理过程中被删除了,因此错误是准确的和预期的。

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