2009-09-09 62 views
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所有个人资料情况下一个QuerySet?也就是说,每个配置文件都有一个外键,从一个关系和指定的东西指向它。

我知道所有关于select_related(),以及我如何使用它来迭代,但我发现迭代恼人(badoop咩!)。此外,values_list()已被查看,但它并不完全正确。

请帮忙!谢谢!

+0

咦? Profile和Relation之间有什么关系?关系与Thingie之间有什么关系?什么是GrooveUser和媒体?请尝试将您的问题提炼为最简单有意义的形式。 – ozan 2009-09-09 01:21:39

+0

我的不好,我不小心留下了一些真实的代码,而不是简单的代码片段。现在修复,谢谢! – neuman 2009-09-09 02:31:19

回答

2

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

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

我不知道,如果一个列表理解算作刺激性迭代,但对我来说这是一个非常直观的,Python的方法。当然,如果你需要它是一个QuerySet,你会做一些混乱与两个查询,如:

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

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

+0

列表理解绝对有效,但OP在抱怨迭代(这基本上是列表理解所做的)... – 2009-09-09 02:59:05

0

您是否阅读过Making queries上的Django文档?它有一个简单的例子来实现你想要的,更具体的是Lookups that span relationships。确保将后一个链接中的代码片段引用到页面开头的模型代码中。

+0

是的,我已经阅读了很多次文档端到端。然而,我似乎只能通过跨越关系来获得比较信息(IE:找到我所有的东西,其中thingie.profile.user = X),而不是实际的实例本身(IE:找到我所有的关系.profiles where relation.thingie = Y)。 – neuman 2009-09-09 02:28:12

0

没有定义配置文件和Thingie之间的直接关系,你不能。

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

通过这种方式,您可以对Thingie进行直接筛选操作,以获取您的配置文件并仍然存储您的中间关系数据。

+0

我可能最终会使用它,因为它更符合Django最佳实践,但我觉得上述答案的第二部分对于此问题更为准确。谢谢! – neuman 2009-09-09 03:48:21

相关问题