django - 如何使用 Django ORM 将注释字符串转换为布尔值
问题描述
我的问题如下。有一个请求
Thread.objects.all().annotate(is_marked=Count('mark', Q(mark__username='gou')))
在 SQL 中它看起来像这样
SELECT "api_thread"."id",
"api_thread"."conference_id",
"api_thread"."title",
"api_thread"."description",
"api_thread"."is_closed",
"api_thread"."is_hidden",
"api_thread"."is_pinned",
"api_thread"."has_voting",
"api_thread"."creator_uid",
"api_thread"."created_at",
"api_thread"."expired",
COUNT("api_thread_mark"."user_id") FILTER (WHERE "auth_user"."username" = 'gou') AS "is_marked"
FROM "api_thread"
LEFT OUTER JOIN "api_thread_mark" ON ("api_thread"."id" = "api_thread_mark"."thread_id")
LEFT OUTER JOIN "auth_user" ON ("api_thread_mark"."user_id" = "auth_user"."id")
GROUP BY "api_thread"."id"
我需要做什么才能将数字转换为布尔值。在 SQL 中它看起来像
COUNT("api_thread_mark"."user_id") FILTER (WHERE "auth_user"."username" = 'gou') > 0 AS "is_marked"
解决方案
像这样的东西?
from django.db.models import Case, When, Value, BooleanField, Count, Q
is_marked__count = Count('mark', Q(mark__username='gou'))
is_marked_bool = Case(When(is_marked__count__gt=0, then=Value(True)), default=Value(False), output_field=BooleanField())
Thread.objects.all().annotate(is_marked__count=is_marked__count).annotate(is_marked_bool=is_marked_bool
参考:条件表达式
推荐阅读
- go - 如何将映射值传递给其他文件
- java - 如何使用列表按顺序对数字进行排序?爪哇
- wso2 - 如何仅将 WSO2 自定义处理程序应用于某些 API?
- c# - 清理数组中未使用的空间
- java - 使用 Firebase 和架构组件从搜索中查询
- python - Django REST Framework NOT NULL 约束失败
- javascript - TypeError:无法读取 React 组件中未定义的属性“fetchAll”
- react-native - 了解 react-native-reanimated 执行
- ios - SizeToFit() 不能与 \n 一起正常工作?
- c++ - C++ 是否可以编排基类相对于其派生类的偏移量?