1

给定模型:

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_related() 的知识,以及如何通过迭代来使用它来做到这一点,但我发现迭代很烦人(badoop bah!)。此外,已经查看了 values_list(),但它并没有做正确的事情。

请帮忙!谢谢!

4

3 回答 3

2

你肯定需要它成为一个查询集吗?如果您只需要它是一个可迭代的,那么一个简单的表达式就是:

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 方法。

于 2009-09-09T02:55:40.570 回答
0

您是否阅读了有关进行查询的 Django 文档?它有一个简单的例子来实现你想要的,更具体地说是跨越关系的查找。确保将后一个链接中的代码片段引用到页面开头的模型代码。

于 2009-09-09T01:33:48.573 回答
0

如果不定义 Profile 和 Thingie 之间的直接关系,则不能。

最好的方法是将 ManyToMany 添加到指向 Profile 的 Thingie 并使用 ManyToMany 上的through参数(django docs)来指定您的关系模型/表。

这样,您可以在 Thingie 上执行直接过滤操作以获取您的配置文件并仍然存储您的中间关系数据。

于 2009-09-09T02:41:36.783 回答