2016-05-10 63 views
0

我一直在打擊從對象列表檢索「子」對象的問題得到一個「子」對象:的Django從對象列表

class BusinessLike(models.Model): 
    user = models.ForeignKey(AppUser, related_name='user_business_likes') 
    business = models.ForeignKey(Business, related_name='business_likes') 
    class Meta: 
     unique_together = (('user', 'business'),) 

我如何在每個'BusinessLike'對象'Business'對象app_user.user_businesses_likes(沒有在列表中循環並使用business_like.business創建新列表)?

+0

什麼是'app_user.user_businesses_likes'?你想要做什麼?你能提供更多的細節! – DhiaTN

回答

1

您可以使用valuesvalues_list

businesses = BusinessLike.objects.values('business') 
businesses = BusinessLike.objects.values_list('business', flat=True) 

但是,這不會給你的對象的列表,你只能得到外鍵ID列表。

Django doc about values and value_list

如果你想避免額外查詢每次你做business_like.business時,你可以使用select_related

business_likes = BusinessLike.objects.select_related('business') 

在這種情況下,當你每BusinessLike對象上環和做business_like.business,Django將不會加入數據庫了,但它已經被緩存在內存中了。

Django doc about select_related

+0

我該如何使這個外鍵列表來放置對象? –

+0

你可以做另一個查詢:'Business.objects.filter(id__in = ids)',但效率不高,我們通常不會這樣做。因爲如果你有一個「BusinessLike」列表,與擁有「Business」列表是一回事,因爲無論如何你必須在某個點上循環,對吧? –

+0

嗯,不完全如我所說,這不是一回事,但'__in'應該可以工作。 –

1

如果您在視圖中執行此操作,可能會發現從Business模型開始創建新的查詢集會更容易。

businesses = Business.objects.filter(business_likes__user=app_user) 

我不確定您是否需要像這樣創建BusinessLike模型。您可以將多對多字段添加到AppUser型號(如果您願意,也可以添加Business型號)。

class AppUser(models.Model): 
    business_likes = models.ManyToManyField(Business) 

Django將負責創建中間表,然後就可以像查詢:

businesses = app_user.business_likes.all()