【问题标题】:Django, avoid foreingkey check on the modelformDjango,避免对模型表单进行外键检查
【发布时间】:2013-11-08 02:59:46
【问题描述】:

保存记录时如何避免对模型表单进行外键检查,因为这会产生 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

【问题讨论】:

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


    【解决方案1】:

    在模型中,使用db_index 选项。

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

    ForeignKey 的 Django 文档:

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

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

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

    (1) 不验证表单。创建它

    form = MyForm(initial=request.GET.items())
    

    然后不要打电话给is_valid()

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

    (3) 创建您自己的表单字段类型,无需验证器。

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

    【讨论】:

    • 我试过你的例子,但这不起作用。我正在使用 postgreSQL、Django 1.6c1 和 Python 2.7.4
    • 这些查询是否在记录保存时运行?
    • 是的,当我在模型窗体“myModelForm.save()”上调用保存方法时
    • 我找不到答案,我不知道这两个查询在 django 上是否是强制性的。
    • 当我在模型表单上执行 is_valid() 时会出现相同的查询。
    猜你喜欢
    • 2011-11-25
    • 2012-02-02
    • 1970-01-01
    • 2014-11-27
    • 2019-11-22
    • 2011-03-04
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多