【发布时间】:2020-04-15 18:17:07
【问题描述】:
模型
class User(AbstractUser):
pass
class Report(Model):
user = ForeignKey (
"User",
related_name="reports"
)
shared_doctors = ManyToManyField (
"User",
symmetrical = False,
related_name="shared_reports"
)
我在模型上有更多字段,但为了缩短问题,我省略了它们。
查询
User.objects.annotate(
shared_reports_user = FilteredRelation(
'shared_reports',
condition = Q(shared_reports__user=user)
)
).annotate(
shared_reports_user_count = Count('shared_reports_user')
)
我已将查询降低到给出意外结果的基本级别。第一个注释中的user 是User 的一个实例。
Query 运行成功,但生成的 QuerySet 没有 shared_reports_user 键,尽管它有一个 shared_reports_user_count 键,其值为 0。
据我从文档中了解到,FilteredRelation 采用模型上存在的一个字段,它将对其进行过滤,以及一个命名参数 condition,它将 Q 对象作为条件应用于现有字段值。这使我相信第一个注释应该返回一个 QuerySet,该 QuerySet 用 shared_reports 的子集进行注释,满足 Q 对象中指定的条件。
我确定我的数据库包含满足 Q 对象的值(我已经手动检查了数据),即使没有输出,我也希望针对键 shared_reports_user 的 QuerySet 为空。
我错过了什么吗?
【问题讨论】:
-
我猜你必须使用像这样的F函数 Count(F('shared_reports_user'))
-
可能,但即使在这种情况下,我的
shared_report_user密钥也不存在。如果注解没有价值,它会消失吗? -
不,不是。当你使用注解 Django 执行左连接时,如果它没有值,它的值设置为 null
-
让我知道它是否有效。
-
@Saber Solooki 我试过了,但没有任何改变
标签: django python-3.x django-models