0

私は、別のモデル "イベント"を参照する "予約"というモデルを外部キーで持っています。Django:リレーションを効果的に照会する方法

class Event(models.Model): 
    title = models.CharField(_("title"), max_length=100) 

class Booking(models.Model): 
    user = models.ForeignKey('auth.User', ..., related_name='bookings') 
    event = models.ForeignKey('Event', ..., related_name='bookings') 

私は、ユーザーがリストビューでそれを使用するために、セットでを予約したすべてのイベントを取得したいです。

私は、ListViewコントロールのget_querysetメソッドを上書きすることによってそれを達成するために管理している:

def get_queryset(self): 
    user_bookings = Booking.objects.filter(user=self.request.user) 
    events = Event.objects.filter(id__in=user_bookings.values('event_id')) 
    return events 

しかし、私はそれが必要なデータベースクエリの面で、私の問題を解決するための非常に効率的な方法ではないことを、かなり確信しています。

私は "select_related"メソッドを使用することを考えましたが、どのように私が自分のユースケースでそれから恩恵を受けることができたのか分かりませんでした。

私の質問は:これをどのように解決しますか?このようなことをする最も効率的な方法は何ですか?

答えて

2

あなたは1行で行うことができます。Event.objects.filter(bookings__user=self.request.user)クリーンなアプローチである

+0

、感謝を。最後に ".distinct()"を追加して、イベントを1回だけ取得しました。しかし、それはクエリの面で効率的ですか?これがどれだけ多くのクエリを生成するか教えていただけますか? – setchock

+0

ああ、そこには別のものが必要かもしれません。これは単一のクエリで、 'print Event.objects.filter(bookings__user = self.request.user).query'で見ることができます。 –

関連する問題