2013-10-29 41 views
1

如何在保存記錄時避免在模型上進行foreingkey檢查,因爲這會產生2個額外的查詢,並且我需要應用程序的速度。Django,避免在模型上進行forekey檢查

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

在該模型中,使用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,驗證和模型保存。

+0

我試過你的例子,但這不起作用。我正在使用postgreSQL,Django 1.6c1和Python 2.7.4 –

+0

這些查詢是否在記錄保存的任何時候運行? –

+0

是的,當我調用modelform「myModelForm.save()」 –