Django,避免对modelform进行外键检查

时间:2013-10-29 05:01:44

标签: django django-models django-forms django-queryset

如何在保存记录时避免对modelform进行外键检查,因为这会产生2个额外的查询,并且我需要在应用程序上加速。

SELECT (1) AS "a" FROM "auth_user" WHERE "auth_user"."id" = 1 LIMIT 1

SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."id" = 1

1 个答案:

答案 0 :(得分:1)

在模型中,使用db_index选项。

 field = django.db.models.ForeignKey('Field', db_index=False)

ForeignKey的Django文档:

  

在ForeignKey上自动创建数据库索引。您可以通过将db_index设置为False来禁用此功能。如果要为一致性而不是连接创建外键,或者如果要创建替代索引(如部分索引或多列索引),则可能希望避免索引的开销。

编辑:db_index=False将关闭INSERTUPDATE上的数据库外键检查,但它不会影响Django的表单验证,这会发生< em>之前 INSERTUPDATE

您有四种选择。第一个是最简单的。

(1)不要验证表格。使用

创建它
form = MyForm(initial=request.GET.items())

然后不要拨打is_valid()

(2)覆盖表单的is_valid方法。这样,您仍然可以通过调用validate()来验证某些字段(而不是其他字段)。

(3)创建自己的表单字段类型,不带验证器。

(4)不要使用Django表单。创建自己的表单HTML,验证和模型保存。