问题描述
假设我有两个模型:User
和Event
:
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
)
有效。
但是
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 COUNT
和HAVING
或类似的替代代码的重复是正常的吗?有没有办法避免我不知道的重复? :-)
我已经注意到这个似乎与之相关的“错误”,但是已经将其标记为已修复很长时间了: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 (将#修改为@)