gpt4 book ai didi

django - 用左外连接注释 Django 查询集?

转载 作者:行者123 更新时间:2023-11-28 19:37:39 26 4
gpt4 key购买 nike

假设我有一个模型:

class Foo(models.Model):
...

还有另一个模型,它基本上为每个用户提供有关 Foo 的信息:

class UserFoo(models.Model):
user = models.ForeignKey(User)
foo = models.ForeignKey(Foo)
...

class Meta:
unique_together = ("user", "foo")

我想生成一个 Foo 的查询集,但根据 user=request.user 使用(可选)相关的 UserFoo 进行注释>.

所以它实际上是一个 LEFT OUTER JOIN on (foo.id = userfoo.foo_id AND userfoo.user_id = ...)

最佳答案

这个答案可能不是您正在寻找的答案,但由于它是搜索“django annotate outer join”时在 google 中的第一个结果,所以我将其发布在这里。

注意:在 Djang 1.7 上测试

假设您有以下模型

class User(models.Model):
name = models.CharField()

class EarnedPoints(models.Model):
points = models.PositiveIntegerField()
user = models.ForeignKey(User)

要获得总用户积分,您可以这样做

 User.objects.annotate(points=Sum("earned_points__points"))

这会起作用,但它不会返回没有积分的用户,这里我们需要没有任何直接 hack 或原始 sql 的外部连接

你可以通过这样做来实现它

 users_with_points = User.objects.annotate(points=Sum("earned_points__points"))
result = users_with_points | User.objects.exclude(pk__in=users_with_points)

这将被翻译成 OUTER LEFT JOIN 并返回所有用户。没有积分的用户将在其积分属性中具有 None 值。

希望对你有帮助

关于django - 用左外连接注释 Django 查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6500066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com