python - Django 的 Q 对象的相等性

标签 python django django-models

我正在尝试比较 django 的 Q objects它们的组成方式完全相同。

但是尽管所有 child 和他们之间的关系都相同,但他们并不被视为平等。

from django.db.models import Q

$ q1 = Q(a=1) & Q(b=1) & Q(c=1)

$ q2 = Q(a=1) & Q(b=1) & Q(c=1)

$ q1 == q2

$ False

这在我使用 Q 对象为我的查询集构建过滤器的单元测试中造成了问题。

为什么两个Q对象不相等?

我正在使用 Django 1.11。

最佳答案

Django <= 1.11.x 没有为 Q 对象实现 __eq__ 方法。 可以看出here .

Django >= 2.0 为 Q 对象实现了 __eq__ 方法。 Code .

所以在Django 2.0之前是无法直接判断两个Q对象是否相等的。

但是可以编写一个简单的函数来检查 Q 对象的相等性。我们可以直接使用 repo 中的代码。

def compare_q(q1 , q2):
        return (
            q1.__class__ == q2.__class__ and
            (q1.connector, q1.negated) == (q2.connector, q2.negated) and
            q1.children == q2.children
        )

因此,对于旧版本的 Django,我们可以这样做:

$ compare_q(q1 , q2)

$ True

关于python - Django 的 Q 对象的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864573/

相关文章:

Python 数据库 api : fetchone vs fetchmany vs fetchall

python - 使用 imagemagick 保存 matplotlib 动画,不使用 ffmpeg 或 mencoder

python - Peewee 模型中的 getter 和 setter 方法

python - Django 管理站点中数据输入的最佳实践(同一模型上的不同 ModelAdmin)

django - 在开发服务器上测试 Facebook 应用程序

django - Django 模型的测试样板 : seeking a portable, 单文件解决方案

python - 带有 reportlab SimpleDocTemplate 和 Django 的两个不同页面

django - 如何按数字显示月份名称?

python - 从表单中获取数据并显示在模板中

python - 在定义模型之前先将ForeignKey定义到该模型