Django带注释的queryset-结果SQ​​L查询重复项

问题描述

假设我有两个模型:UserEvent

class User(models.Model):
    email = models.EmailField(_('Email'),max_length=255,unique=True,db_index=True)

class Event(models.Model):
    class Type(models.IntegerChoices):
        ONE = 1,'One'
        TWO = 2,'Two'

    type = models.PositiveSmallIntegerField('Type',default=Type.ONE,choices=Type.choices,null=False,blank=False)
    when = models.DateTimeField(_('When?'),blank=True,null=True)

现在,我有一个如下定义的查询集,以过滤事件数为5倍数的用户。使用数据库功能Mod()

cycle_size = 5

users = User.objects.annotate(
    event_count=Coalesce(Subquery(
        Event.objects.filter(
            user__pk=OuterRef('pk')
        ).order_by(
            'user__pk'
        ).annotate(
            count=Count('pk',distinct=True)
        ).values(
            'count'
        ),output_field=models.IntegerField()
    ),0),event_cycle_mod=Mod(F('event_count'),Value(cycle_size ))
).filter(
    event_count__gt=0,event_cycle_mod=0
)

有效。

但是

生成的结果SQL查询如下所示:

SELECT
  `user`.`id`,FROM
  `user_user`
WHERE
  (
    `user_user`.`id` IN (
      SELECT
        V0.`id`
      FROM
        `user_user` V0
      WHERE
        (
          COALESCE(
            (
              SELECT
                COUNT(disTINCT U0.`id`) AS `count`
              FROM
                `event_event` U0
              WHERE
                (
                  U0.`user_id` = V0.`id`
                )
              GROUP BY
                U0.`user_id`
              ORDER BY
                NULL
            ),0
          ) > 0
          AND MOD(
            COALESCE(
              (
                SELECT
                  COUNT(disTINCT U0.`id`) AS `count`
                FROM
                  `event_event` U0
                WHERE
                  (
                    U0.`user_id` = V0.`id`
                  )
                GROUP BY
                  U0.`user_id`
                ORDER BY
                  NULL
              ),0
            ),5
          ) = 0.0
        )
    )
  )

问题如下:重复整个COALESCE()和COUNT()函数调用是否正常?期望使用AS COUNTHAVING或类似的替代代码的重复是正常的吗?有没有办法避免我不知道的重复? :-)

我已经注意到这个似乎与之相关的“错误”,但是已经将其标记为已修复很长时间了:https://code.djangoproject.com/ticket/26658

如果有用:运行django 3.1.3和MysqL 5.7.xx。

(请忽略像user_user.id IN (SELECT V0.id FROM user_user V0这样的位的嵌套-它们是查询集动态构建的结果。)

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...