Django - 加入特定列
Django - Join on specific column
我有一个模型,我们称它为Notification
。通知有一个 from_user
和一个 to_user
以及其他现在不重要的字段。
class Notification(models.Model):
from_user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='from_user'
)
to_user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='to_user'
)
read = models.BooleanField(default=False)
...
我想实现的是,理论上很简单,但我无法让它工作。
我想获取每个用户的未读通知数。
以下 Django ORM 表达式:
User.objects.annotate(
notification_count=Count('notification', filter=(Q(notification__read=False)))
).values('notification_count')
产生以下 SQL:
SELECT COUNT("notification"."id") FILTER (WHERE "notification"."read" = False) AS "notification_count"
FROM "account"
LEFT OUTER JOIN "notification" ON ("account"."id" = "notification"."from_user_id")
GROUP BY "account"."id"
ORDER BY "account"."member_since" DESC
但这不是我想要的。我希望 LEFT_OUTER_JOIN
在 to_user
列而不是 from_user
列上完成。
如何使用 Django ORM 实现此目的?
在尝试了无数次之后,我找到了解决方案。在这里,对于任何需要它的人:
User.objects.annotate(
notification_count=Count('to_user', filter=(Q(to_user__read=False)))
).values('notification_count')
我有一个模型,我们称它为Notification
。通知有一个 from_user
和一个 to_user
以及其他现在不重要的字段。
class Notification(models.Model):
from_user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='from_user'
)
to_user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='to_user'
)
read = models.BooleanField(default=False)
...
我想实现的是,理论上很简单,但我无法让它工作。 我想获取每个用户的未读通知数。
以下 Django ORM 表达式:
User.objects.annotate(
notification_count=Count('notification', filter=(Q(notification__read=False)))
).values('notification_count')
产生以下 SQL:
SELECT COUNT("notification"."id") FILTER (WHERE "notification"."read" = False) AS "notification_count"
FROM "account"
LEFT OUTER JOIN "notification" ON ("account"."id" = "notification"."from_user_id")
GROUP BY "account"."id"
ORDER BY "account"."member_since" DESC
但这不是我想要的。我希望 LEFT_OUTER_JOIN
在 to_user
列而不是 from_user
列上完成。
如何使用 Django ORM 实现此目的?
在尝试了无数次之后,我找到了解决方案。在这里,对于任何需要它的人:
User.objects.annotate(
notification_count=Count('to_user', filter=(Q(to_user__read=False)))
).values('notification_count')