【发布时间】:2012-08-15 00:34:07
【问题描述】:
你好 Stackoverflow 的人,
我在 Django 中遇到了一个与 select_related 查询有关的奇怪问题。我已经安装了django-cities app,它列出了大量城市的地理信息。 在我的项目模型中,我为城市元素创建了一个外键,以将位置存储在我的 models.py 中。
from cities.models import City
class Project(models.Model):
...
city = models.ForeignKey(City, blank = True, null = True)
由于可能的城市数量众多,我在基于类的视图 中创建了一个查询,该查询在创建项目对象时选择了相关的城市字段。
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from project.models import Project
class ProjectCreate(CreateView):
queryset = Project.objects.select_related('city__country', 'city__region').all()
template_name = 'solution/solution_create_form.html'
但是,当我请求 ProjectCreate 类时,Django 仍然从数据库中提取无数外键。记录器显示了无限数量的以下请求。
... 调试(0.000)选择“cities_region”。“id”,“cities_region”。“名称”, "cities_region"."slug", "cities_region"."name_std", "cities_region"."code", "cities_region"."country_id" FROM "cities_region" WHERE "cities_region"."id" = 3861887 ;参数=(3861887,) 调试(0.000)选择“cities_country”。“id”,“cities_country”。“名称”, "cities_country"."slug", "cities_country"."code", "cities_country"."population", "cities_country"."continent", "cities_country"."tld" FROM "cities_country" WHERE "cities_country"."id" = 3865483 ; args=(3865483,) D ...
执行ProjectCreate类时如何强制选择相关方法?
感谢您的帮助和建议!
【问题讨论】:
-
显示您的 Project.objects... 查询的调试信息 (SQL)
-
有趣的是,当我执行
from django.db import connection print "Query %s" % connection.queries时,查询为空。有没有更好的方法来显示查询? django-toolbar 不起作用,因为当 sql 请求变得疯狂时,站点没有完全加载。 -
有不同的方法。查找数据库驱动程序的 base.py。例如,在我的系统上,Postgres 的 base.py 位于 /lib/python2.6/site-packages/django/db/backends/postgresql_psycopg2/base.py>。然后在类 CursorWrapper 中找到方法 execute()。在打印方法参数的方法开头添加一个新行:查询和参数。
-
嗯,我得到了类似的结果。在 sql 请求变得疯狂之前,只请求了一个其他模型。结果:
SELECT postgis_lib_version() None SELECT "product_subcategory"."id", "product_subcategory"."category", "product_subcategory"."name", "product_subcategory"."long_name", "product_subcategory"."slug" FROM "product_subcategory" () SELECT "cities_city"."id", "cities_city"."name", "cities_city"."slug", "cities_city"."name_std", "cities_city"."location", "cities_city"."population", "cities_city"."region_id", "cities_city"."subregion_id", "cities_city"."country_id" FROM "cities_city" () -
您是否有机会在创建表单的下拉列表中填充城市/地区名称?
标签: django django-models foreign-keys django-class-based-views django-select-related