Den*_*nov 6 django django-models django-aggregation django-annotate django-2.0
我正在尝试查询和注释模型中的一些数据:
class Feed(models.Model): # Feed of content
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Piece(models.Model): # Piece of content (video or playlist)
removed = models.BooleanField(default=False)
feed = models.ForeignKey(Feed, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
在以下查询中未使用其他字段,因此在此跳过了它们。
在我看来,我需要获取经过身份验证的用户的所有供稿的queryset。批注应包含所有未删除的数量。
最初,Piece模型不包含removed字段,并且一切都可以与queryset一起运行,如下所示:
Feed.objects.filter(user=self.request.user).annotate(Count('piece'))
Run Code Online (Sandbox Code Playgroud)
但是随后我将字段添加removed到Piece模型中,只需要计算未删除的部分:
Feed.objects.filter(user=self.request.user)
.annotate(Count('piece'), filter=Q(piece__removed=False))
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
'WhereNode' object has no attribute 'output_field'
Run Code Online (Sandbox Code Playgroud)
这只是django在错误页面上输出的内容的一小部分,因此,如果这还不够的话,请告诉我我需要在问题中包含的内容。
我试图在这里和那里包含output_field诸如models.IntegerField()或models.FloatField()(正确导入)之类的选项,但是出现了一些我未在此处提供的错误,因为我认为这些操作没有意义。
我正在使用Django 2.0.3
Anu*_*dav 10
您的语法错误在这里,
Feed.objects.filter(user=self.request.user)
.annotate(Count('piece', filter=Q(piece__removed=False)))
Run Code Online (Sandbox Code Playgroud)
过滤器需要应用在Count而不是annotate。
Django文档的参考:https : //docs.djangoproject.com/en/2.1/topics/db/aggregation/#filtering-on-annotations
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |