【问题标题】:Django object count is non-zero with no objects following deletions for polymorphic modelDjango 对象计数非零,多态模型删除后没有对象
【发布时间】: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

背景:

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

  1. pg_dump my_db -F tar -f dbdumps/backup.tar备份了数据库
  2. 通过./manage.py dumpdata my_app --natural --indent=4 &gt; 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.

...引导我通过上述 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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 2021-10-24
      • 1970-01-01
      • 2014-11-19
      • 2015-11-29
      • 1970-01-01
      • 2020-08-24
      • 2016-06-11
      • 2014-05-07
      相关资源
      最近更新 更多