首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django: QuerySet.update()在使用Count()和filter时返回FieldError

Django: QuerySet.update()在使用Count()和filter时返回FieldError
EN

Stack Overflow用户
提问于 2021-10-22 16:10:38
回答 1查看 48关注 0票数 1

鉴于这一点:

代码语言:javascript
运行
复制
class User(models.Model):
    organization = models.ForeingKey(
        "Organization",
        related_name="users",
        ...
    )
    is_active = models.BooleanField(default=True)


class Organization(models.Model):
    active_user_count = models.IntegerField(default=0)

当我运行这段代码时,如果我们以独占方式运行第2行或第3行,这两行都会失败:

代码语言:javascript
运行
复制
au_count = Count("users", filter=Q(users__is_active=True))

# Line: 2
Organization.objects.update(active_user_count=au_count)
# Line: 3
Organization.objects.annotate(auc=au_count).update(active_user_count=F("auc")

我得到以下错误:

代码语言:javascript
运行
复制
FieldError: Joined field references are not permitted in this query

注释(annotate())而不是更新,工作得很好。

我找不到使用子查询()的这种解决方案的示例

这个要求的替代方案是什么?我是不是犯了一个设计错误?

EN

回答 1

Stack Overflow用户

发布于 2021-10-22 17:32:47

我通过执行以下操作解决了这个问题:

代码语言:javascript
运行
复制
customers = Customer.objects.annotate(
    auc=Count("users", filter=Q(users__is_active=True))
).values("pk", "auc")

customers = [Customer(pk=c["pk"], active_user_count=c["auc"]) for c in customers]

Customer.objects.bulk_update(customers, ["active_user_count"])

仍然不确定这是否是最好的答案,但它以一种有效的方式解决了问题,总共有2个查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69680032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档