我使用了一个注解,它在返回文章列表时统计得票/反对票:
queryset = queryset.annotate(
upvotes_count=models.Sum(
models.Case(
models.When(likes__like_state=1, then=1),
default=0,
output_field=models.IntegerField()
)
)
).annotate(
downvotes_count=models.Sum(
models.Case(
models.When(likes__like_state=-1, then=1),
default=0,
output_field=models.IntegerField()
))
)
但是每篇文章也有一些类别,比如许多相关字段,我需要返回那些以逗号分隔的类别,所以我编写了这个函数:
class GroupConcat(models.Aggregate):
function = 'GROUP_CONCAT'
template = "%(function)s(%(distinct)s %(expressions)s %(separator)s)"
def __init__(self, expression, distinct=False, separator=', ',**extra):
super(GroupConcat, self).__init__(
expression,
distinct='DISTINCT' if distinct else '',
separator="SEPARATOR '%s'" % separator,
output_field=models.CharField(),
**extra
)
并将其添加到我的注解中:
queryset = queryset.annotate(category=GroupConcat('categories__name'))
很好,但是 upvotes_count
以及 downvotes_count
变得疯狂并开始繁殖(!)按类别数量列出的结果。
所以问题是:“有没有一种方法可以在django中使用groupconcat而不分解sum注解?”
1条答案
按热度按时间suzh9iv81#
很好的解决方案。但要使用groupbyfield进行操作,应该使用orderbystatement。例如:
store.objects.all().values('value').order_by('value').annotate(stores=groupconcat('id'))
将生成sql语句
选择
store
.value
,组\u concat(store
.id
分隔符“,”)为stores
从store
哪里store
.value
>0分组依据store
.value
订货人store
.value
asc公司结果是值,存储1“16,27”
如果没有命令,它会是这样的:
选择
store
.value
,组\u concat(store
.id
分隔符“,”)为stores
从store
哪里store
.value
>0分组依据store
.id
订货人store
.value
asc公司结果就是价值,存储1 16 2 27