如何避免使用 Django 模型表单重复 SQL 查询?
How can I avoid duplicate SQL queries with Django model forms?
我有以下型号:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=30)
class Article(models.Models):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
text = models.TextField()
和一个通用的 CreateView
from django.views.generic.edit import CreateView
urlpatterns += [
path("", CreateView.as_view(model=models.Article, fields="__all__"))
]
使用以下模板 (article_form.html)
<form method="post">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="Submit">
</form>
我正在使用 Django Debug Toolbar 列出针对每个 Web 请求执行的 SQL 查询。
我的问题是: 为什么以下 SQL 作者列表查询对每个请求执行 两次 ?我怎样才能避免重复查询?
SELECT "myapp_author"."id", "myapp_author"."name" FROM "myapp_author"
此外,调试工具栏显示第一个查询只用了 0.5 毫秒,而第二个查询用了 42 毫秒!几乎长了 100 倍。怎么会这样?
我正在使用带有 SQLite 数据库的 Django 3.2。
谢谢!
进一步调查问题后,我发现 SQL 查询也可以通过适当配置 LOGGING 记录到控制台:
settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
"level": "DEBUG",
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
这表明 SELECT 查询实际上只执行了一次,这是应该的。所以这个错误肯定是在Debug Toolbar 误报了两次。
我有以下型号:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=30)
class Article(models.Models):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
text = models.TextField()
和一个通用的 CreateView
from django.views.generic.edit import CreateView
urlpatterns += [
path("", CreateView.as_view(model=models.Article, fields="__all__"))
]
使用以下模板 (article_form.html)
<form method="post">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="Submit">
</form>
我正在使用 Django Debug Toolbar 列出针对每个 Web 请求执行的 SQL 查询。
我的问题是: 为什么以下 SQL 作者列表查询对每个请求执行 两次 ?我怎样才能避免重复查询?
SELECT "myapp_author"."id", "myapp_author"."name" FROM "myapp_author"
此外,调试工具栏显示第一个查询只用了 0.5 毫秒,而第二个查询用了 42 毫秒!几乎长了 100 倍。怎么会这样?
我正在使用带有 SQLite 数据库的 Django 3.2。
谢谢!
进一步调查问题后,我发现 SQL 查询也可以通过适当配置 LOGGING 记录到控制台:
settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
"level": "DEBUG",
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
这表明 SELECT 查询实际上只执行了一次,这是应该的。所以这个错误肯定是在Debug Toolbar 误报了两次。