又遇到了灵异事件。。Django的ORM。orz.
昨天对Blog的程序进行了优化。见前一篇文章, 因于文章分类允许为Null导致查询文章列表时(列表需要显示分类名)Select_related不起作用引发了1+N问题,所以我把Null= True去掉。减却了多余的N条查询。但是奇怪的事情发生了,我从早上开始发觉,首页列表的作者变成了Blog的Title。但代码明明是 {{entry.author.name}}!我改成其他属性试下,依然是Print出Blog的其他属性。我回想昨天更新做过的改动,撒销均无效。最后 想起会不会是因为改了Model的属性引起的,于是我把分类的Null=True加上。果然!显示正常了。这是为什么呢?不解!缓存?没可能吧?
我是不可能再把分类的Null=true保留的,因为实践证明这样对性能损耗太大。但不加上又出现属性值错乱的情况。怎么办?最后我作了个尝试,我把Model里面的属性调换了一下位置,原来Author在Catelog下方:
catelog = models.ForeignKey(Catelog,verbose_name='分类')
author = models.ForeignKey(Account,verbose_name='作者')
现在改回来,Author写在Catelog上方。显示正常。My god!
author = models.ForeignKey(Account,verbose_name='作者')
catelog = models.ForeignKey(Catelog,verbose_name='分类')
这是我的程序的Bug?还是Django的Bug?还是我的Bug?我想这个解决的办法不是好办法。
我拿到三种情况的Sql。一是分类为Null的查询,二是分类为NotNull的查询,三是分类为NotNull且Author属性排在 Catelog前面的查询。结果是第一和第三种情况blog_account_name所在的列位置是一样的。这是否说明Django的确是记住查询结果 的位置并且缓存起来了?但缓存到哪里了呢?如果刷新呢?
原因追寻中。原文见:http://www.fallever.com/blog/jeff/17/
分享到:
相关推荐
Django ORM机制的总结 Django ORM(Object-Relational Mapping,对象关系映射)机制是Django框架中的一种强大功能,它允许开发者使用Python代码来操作数据库,实现了对象和关系数据库之间的映射。下面是Django ORM...
在Python的世界里,Django是一个强大的Web开发框架,它提供了ORM(对象关系映射)工具,使得开发者可以使用Python代码来操作数据库,而无需编写SQL。本篇文章将深入探讨Django ORM如何实现按月分组统计的功能,以及...
Django ORM,全称为Object-Relational Mapping,是Django框架中的一个重要组成部分,它提供了一种将数据库操作转化为Python对象的方法,使得开发者可以避免直接编写SQL语句,从而更加高效、安全地进行数据库操作。...
django-bulk-update, 在 Django ORM上使用一个查询进行批量更新 django-bulk-update 简单批量更新 Django ORM或者 helper 函数。这个项目旨在批量更新给定的对象,使用英镑的一个查询 Django 。安装pip install ...
在Python的Web开发中,Django是一个非常流行的框架,它提供了强大的ORM(对象关系映射)功能,使得开发者可以方便地操作数据库而无需编写SQL语句。本篇将深入探讨如何在Django中动态创建多个模型的表名,并利用ORM...
在 Django 框架中,ORM (Object-Relational Mapping) 是一种强大的工具,它允许开发者用 Python 对象来操作数据库,而无需直接编写 SQL 语句。外键(Foreign Key)是数据库关系中的一种机制,用于在一个表中引用另一...
在IT行业中,Django是一个非常流行的Python Web框架,它提供了许多强大的功能,其中包括ORM(对象关系映射)系统。ORM允许开发者使用面向对象的方式来操作数据库,而无需编写SQL语句,提高了开发效率和代码的可移植...
自制单独提取的DjangoORM,可以使用manage.py inspectdb 从数据库直接生成model,简单方便,稍微简单的配置数据库信息就可以让一些小的APP直接使用djangoORM。单独提取的文件总大小为8KB。操作方法与在Django内使用...
在Django框架中,ORM(Object-Relational Mapping)是一种将数据库操作转化为对象操作的技术,使得开发者无需直接编写SQL语句即可与数据库交互。在处理大量数据更新时,使用ORM进行批量更新是一种高效且安全的方法。...
在 Django ORM 中,`exists()` 是一个强大的工具,用于构建复杂的查询条件,尤其是处理子查询时。在 SQL 中,`EXISTS` 子句用于检查子查询是否返回任何行,如果返回至少一行数据,`EXISTS` 就是 `TRUE`,否则为 `...
django-wham, REST api伪装为 Django ORM模型 wham作为 Django ORM模型的 REST api使用 django-wham,你可以按照查询 Django 模型的方式来查询 REST api:>>> artist = SpotifyArtist.
Django ORM,全称为Object-Relation Mapping,是一种用于数据库操作的技术,它允许开发者使用面向对象的方式来处理数据库,而无需直接编写SQL语句。在Django的MVT(Model-View-Template)架构中,ORM主要体现在Model...
标题中的“django ORM如何处理N+1查询”指的是在使用Django的Object-Relational Mapping (ORM)系统时,如何避免或解决常见的N+1查询问题。N+1查询问题通常发生在试图从关联模型中获取数据时,导致数据库执行过多的...
在开发Web应用时,Django ORM(对象关系映射)是一个强大的工具,但它在处理大量数据或复杂查询时可能会出现性能问题。本文将探讨如何优化Django ORM的性能,以提高应用程序的效率。 首先,我们需要关注数据库层面...
ORM的模型接口。 重要提示:该项目应被视为实验性的进行中项目。 当前的API设计和行为尚未最终确定,并且尚未确定特定的版本支持。 安装 pip install pydantic-django 用法 要求:Python 3.7+,Django 2+ 基本...
django-celery-beat, Django ORM支持的celery 周期任务 数据库后台任务 版本:站点:下载:关键字:关键字:1.1.1http://django-celery-beat.readthedocs.io/http://pypi.python.org/pypi
django-softdelete Django ORM的软删除,并支持undelete。 支持Django 2.0+ 该项目提供了对软删除对象的取消删除,以及相关对象的正确删除。 灵感来自要求Django 1.8以上django.contrib.contenttypes安装pip install...
DjangoX, 用于 Django ORM数据或者API数据管理的web GUI套件 DjangoX用于 Django ORM数据或者API数据管理的web GUI套件支持Python2和 Python3 ;兼容 Django1.5 easy_install djangoeasy_i
在Django框架中,对象关系映射(ORM)是一个强大的特性,它允许开发者通过Python代码来操作数据库,而无需编写SQL语句。这种抽象避免了与特定数据库系统的直接耦合,从而增强了代码的可移植性和可维护性。不过,在...
Django ORM是Python语言编写的Web开发框架Django中的一个核心组件,它提供了一种便捷的方式来处理数据库中的数据。在Django ORM中,模型(Models)通过类来映射数据库中的表,字段(Fields)则代表了表中的列。本篇...