2011-04-06 50 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