【发布时间】:2014-07-14 05:28:43
【问题描述】:
Django recommends 没有在 null 上使用 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 调用之前过滤掉空字符串,但我的查询更复杂,我需要所有空和非空对象。
有没有更聪明的方法来使用 注释和跳过 count 中的空值,或者我应该从
更改模型review = models.CharField(max_length=200, default='', blank=True)
到
review = models.CharField(max_length=200, default=None, blank=True, null=True)
【问题讨论】:
-
Book.objects.filter(review != '').values('category').annotate(count=Count('review')) -
来自问题描述:
I could filter out empty strings before the annotate call but my Query is more complex and I need all empty & non-empty objects -
恐怕添加
null=True对您没有帮助。您应该使用原始 sql 查询 docs.djangoproject.com/en/dev/topics/db/sql -
可以用order_by方法,后跟distinct吗?但是,检查 django 文档,他们警告这种情况:docs.djangoproject.com/en/dev/ref/models/querysets/#distinct
标签: django django-models django-queryset django-aggregation