如何减少测试django中唯一性的查询数量?

时间:2013-11-02 18:22:07

标签: python sql django

说我有一个模特:

class User(models.Model):
    username = models.CharField(max_length=30, unique=True)
    email = models.EmailField(unique=True)

当我创建User时,django需要首先检查唯一约束,并使用两个单独的查询来执行此操作,例如

SELECT (1) AS "a" FROM "accounts_user" WHERE "accounts_user"."username" = 'aoeu' LIMIT 1

SELECT (1) AS "a" FROM "accounts_user" WHERE "accounts_user"."email" = 'aoeu@aoeu.com' LIMIT 1

如何告诉django在一个查询中检查两个约束,如

SELECT (1) AS "a" FROM "accounts_username" WHERE "accounts_user"."username" = 'aoeu' OR "accounts_user"."email" = 'aoeu@aoeu.com' LIMIT 1

2 个答案:

答案 0 :(得分:0)

在这种情况下,没有简单的方法可以告诉Django只进行一次查询。您可以停止使用Django模型表单验证,并编写自己的原始SQL查询。但是,保存单个SQL查询可能不值得。

您可以深入研究Django源代码,并尝试优化生成唯一性约束检查的位置。如果你正常工作,你可以将其作为补丁提交。

答案 1 :(得分:0)

我猜你可以使用Q objects来做到这一点。
以下是文档参考:https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

然后Q(username='aoeu') | Q(email='aoeu@aoeu.com')将等于WHERE username = 'aoeu' OR email = 'aoeu@aoeu.com'

相关问题