2016-05-10 9 views
0
私は、オブジェクトのリストから「サブ」オブジェクトの取得の問題に対処されている

から「サブ」オブジェクトを取得しますapp_user.user_businesses_likes(リストをループしてbusiness_like.businessで新しいリストを作成することなく)?Djangoはオブジェクトリスト

+0

'app_user.user_businesses_likes'は何ですか?あなたは正確に何をしたいですか?詳細を教えてください! – DhiaTN

答えて

1

あなたはvaluesまたはvalues_listを使用することができます。

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

しかし、これはあなたのオブジェクトのリストを与えることはありません、あなただけの外部キーIDのリストを取得します。

Django doc約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

オブジェクトのlisstにこの外部キーのリストを作成するにはどうすればよいですか? –

+0

'Business.objects.filter(id__in = ids)'という別のルックアップを行うこともできますが、効率的ではなく、通常は行いません。もしあなたが 'BusinessLike'のリストを持っていれば、'ビジネス 'のリストを持っているのと同じことです。とにかくいつでもそれをループする必要があるからです。 –

+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() 
関連する問題