2011-04-06 113 views
0
class ExternalUser(models.Model): 
    user = models.ForeignKey(User) 
    external_account_id = models.CharField(max_length=200, null=True, blank=True) 

class ExternalFriends(models.Model): 
    external_user = models.ForeignKey(ExternalUser) 
    external_account_id = models.CharField(max_length=200, null=True, blank=True) 

想我先得到所有ExternalFriends:我将如何在Django中执行此查询?

all_friends = ExternalFriends.objects.all() 

好了,现在我有一个查询集。

我该如何SELECT * FROM ExternalUser WHERE external_account_id IN [ ...all_friends's external_account_ids... ]

什么是Django的等价物?

+0

你真的需要两种型号的“EXTERNAL_ACCOUNT_ID”场?由于您的ExternalFriends已经与ExternalUser相关联,因此可以将该ID存储在ExternalUser模型上。这也可以简化您的查询。 – arie 2011-04-06 08:32:33

+0

也许:ExternalUser.objects.filter(external_friends__external_account_id__is_null = False) – Jerzyk 2011-04-06 09:34:14

回答

1

当然也可以更有效地进行,但...

ExternalUser.objects.filter(external_account_id__in=[friend.id for friend in all_friends]) 
+0

它如何更有效地完成? – TIMEX 2011-04-06 08:10:02

+0

希望别人能回答这个问题!我认为只需要ids all_friends = ExternalFriends.objects.all()。values('id')然后将frield.id替换为朋友['id'] – JamesO 2011-04-06 08:17:32

+0

+1 IN子句通常效率不高,但是您的查询是正确的这个情况。我们如何得到“all_friends”是避免IN的问题,并且如果可能的话加入。 – 2011-04-06 08:47:00