gpt4 book ai didi

python - 如何通过关系模型选择所有对象

转载 作者:行者123 更新时间:2023-12-01 06:19:23 25 4
gpt4 key购买 nike

给定模型:

class Profile(models.Model):
user = models.ForeignKey(User, unique=True)

class Thingie(models.Model):
children = models.ManyToManyField('self', blank=True, symmetrical=False)

class Relation(models.Model):
profile = models.ForeignKey(Profile)
thingie = models.ForeignKey(Thingie)

如何返回包含与给定 Thingie 相关的所有 Profile 实例的 QuerySet?也就是说,每个配置文件都有一个外键从关系指向它并指向给定的事物。

我知道有关 select_lated() 的所有信息,以及如何使用它通过迭代来完成此操作,但我发现迭代很烦人(badoop bah!)。另外,values_list() 已经被研究过,但它并没有完全做正确的事情。

请帮忙!谢谢!

最佳答案

您确实需要它作为查询集吗?如果您只需要它是一个可迭代的,则适合您目的的简单表达式是:

profiles = [r.profile for r in thingie.relation_set.all()]

我不确定列表理解是否算作令人恼火的迭代,但对我来说,这是一种完全直观的 Python 方法。当然,如果您需要它作为查询集,您将使用两个查询做一些更困惑的事情,例如:

relation_values = thingie.relation_set.all().values_list('pk', flat=True)
profiles = Profile.objects.filter(relation__in=relation_values)

有关更多信息,请参阅“in ”文档。如果您不需要查询集,我更喜欢第一种方法。哦,如果您只想要不同的配置文件,您可以在第一种方法中使用 set(profiles) 或使用 distinct()第二种方法中的queryset方法。

关于python - 如何通过关系模型选择所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1396985/

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