3

Django 建议不要使用nullon CharField,但是 annotate 在计数中包含空字符串。有没有办法在不从查询中排除具有空字符串的行的情况下避免这种情况?

我的问题不仅仅是如何实现我的查询,而是从根本上说,注释/聚合计数是否应该包含空字段。Django 认为空作为基于字符串的字段的 NULL 的替代品。

我的模型:

class Book(models.Model):
    name = models.CharField(...)

class Review(models.Model):
    book = models.ForeignKey()
    category = models.ForeignKey()
    review = models.CharField(max_length=200, default='', blank=True)

要按类别计算非空评论和分组,我使用

Review.objects.values('category').annotate(count=Count('review'))

这不起作用,因为 annotate 也计算空值(如果条目为 NULL,则不会这样做)。我可以在 annotate 调用之前过滤掉空字符串,但我的查询更复杂,我需要所有空和非空对象。

有没有更聪明的方法来使用注释和跳过计数中的空值,或者我应该从

review = models.CharField(max_length=200, default='', blank=True)

review = models.CharField(max_length=200, default=None, blank=True, null=True)
4

2 回答 2

1

我遇到了非常相似的情况。我使用条件表达式解决了它:

review_count = Case(
    When(review='', then=0),
    default=1,
    output_field=IntegerField(),
)
Review.objects.values('category').annotate(count=review_count)
于 2021-02-12T21:58:43.540 回答
0

...我需要所有空的和非空的对象。

这在使用时没有任何意义valuescategory您将获得一个仅包含andcount键的字典列表,而不是实际对象。除了 中的不同数字之外,您会发现过滤掉空值与否count之间没有区别。review最重要的是,您过滤一本书 ( id=2) 并以某种方式期望可能有多个评论。

您需要认真重新考虑您到底想要做什么,以及您的模型定义如何适应它。

于 2014-05-25T08:14:00.063 回答