2016-10-08 28 views
1

Djangoアプリケーションでは、ユーザーセッションにアクセスしてからflat=Trueでusers_idsを取得できます。例えば。私はやっている:Djangoクエリーセットから重複しない値を除外する

Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True) 

しかし、結果は重複して、None値によって汚染されています。同じクエリを実行して、[なし]または重複を除外するにはどうすればよいですか?

time_window = timezone.now() - timedelta(minutes=5) 
user_ids = Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True) 
user_ids = [id for id in user_ids if id is not None] 
user_ids = set(user_ids) 

しかし速いだろうDBを照会しながら、私は直接それを達成していることができれば、私は疑問に思う:これを行うには

一つの方法です。パフォーマンスが重要です。


誰もが興味を持っていた場合、私はORMはisnullで空のユーザーフィールド、フィルタを除外するには

答えて

3

をオブジェクトとしてDjangoのセッションオブジェクトにアクセスできるようにするにはhttps://github.com/Bouke/django-user-sessionsを使用しています。

Session.objects\ 
    .filter(user__isnull=False)\ 
    .filter(last_activity_gte=time_window)\ 
    .values_list('user_id', flat=True) 

、重複を削除するには、あなたが.distinct('user')を使用することができますが、それは唯一のいくつかのデータベースバックエンドで動作します。 MySQLはそれをサポートしていないようです。

+0

私にとってはうまくいくはずです。私はpostgresqlを使用しています。 –

+0

Btw、 'values_list'と' distinct'をこのように一緒に使うのはいいですか? –

+0

はい、可能です。 – C14L

関連する問題