【问题标题】:When Django's ORM Uses Q?Django 的 ORM 什么时候使用 Q?
【发布时间】:2011-06-23 20:07:02
【问题描述】:

我正在尝试使用 Django 的 Q 功能来生成一些 AND 和 OR SQL 查询,但不幸的是,我似乎无法弄清楚 Django 如何以及何时生成它的条件。我有一个更复杂的查询,但我决定减少它,看看发生了什么。

没有 Q() 的例子:

>>> MyObject.objects.filter(status='VALUE').count()
6

现在是 Q():

>>> MyObject.objects.filter(Q(status='VALUE')).count()
22

以及从 django.db.connection 生成的查询:

[{'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject" WHERE "myobjects_myobject"."status" = E\'VALUE\' '}, {'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject"'}]

然后我添加另一个值:

>>> MyObject.objects.filter(Q(status='VALUE'), Q(created_date__lt=a_date_value)).count()
22

但是当我颠倒这个顺序时,我得到:

>>> MyObject.objects.filter(Q(created_date__lt=a_date_value), Q(status='VALUE'), ).count()
6

使用 SQL:

[{'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject" WHERE "myobjects_myobject"."created_date" < E\'2011-02-09 00:24:55.927825\' '}, {'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject" WHERE "myobjects_myobject"."status" = E\'VALUE\' '}

所以在我看来,它每次都忽略第一个 Q 值 - 这是预期的行为吗?

【问题讨论】:

    标签: django django-queryset django-q


    【解决方案1】:

    如果这是您执行的实际代码,而不是您偶然发现 Django 中的错误。

    以下应该有相同的结果:

    >>> MyObject.objects.filter(status='VALUE').count()
    >>> MyObject.objects.filter(Q(status='VALUE')).count()
    

    但这并不重要,Q 对象从来都不是真正需要的。

    而不是这个:

    >>> qs = MyObject.objects.all()
    >>> qs.filter(Q(status='VALUE') | Q(status='UNKNOWN')).count()
    

    你也可以这样用:

    >>> qs = MyObject.objects.all()
    >>> (qs.filter(status='VALUE') | qs.filter(status='UNKNOWN')).count()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2017-02-20
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多