【问题标题】:How to reduce number of queries testing uniqueness in django?如何减少在 django 中测试唯一性的查询数量?
【发布时间】:2013-11-02 18:22:06
【问题描述】:

假设我有一个模型:

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

【问题讨论】:

    标签: python sql django


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我想你可以使用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'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 2011-09-24
        • 2021-07-16
        • 2016-07-10
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多