2016-10-08 1 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

객체로 장고 세션 개체에 액세스 할 수 있도록 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