说我有一个模特:
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
答案 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'