2013-07-25 2 views
0

내가 두 가지 모델이 있다고 가정 :장고 쿼리 자세한 주말이나 평일

class User(models.Model): 
    name = CharField(max_length=42) 

class Action(models.Model): 
    user = models.ForeignKey(User) 
    timestamp = models.DateTimeField(auto_now_add=True) 

을 내가 주와 그 반대의 다른 날보다 주말에 더 행동 (일요일 및 토요일)에있는 모든 사용자를 찾을 수있는 방법 ?

편집 : 한 명의 사용자에게이 조건을 확인하지 않아도됩니다. 이러한 조건 중 하나를 보유한 모든 사용자를 선택해야합니다.

+0

참조 http://stackoverflow.com/questions/4600325/django-datefield-filter-by-weekday-weekend –

+0

@PaulTomblin 저는 평일까지 간단하게 선택하는 방법을 알고 있지만 더 많은 작업이있는 사용자를 효율적으로 선택해야합니다. 주말에는 다른 날보다. – Shark

+0

평일까지 선택을 작성한 후에'.count()'를 할 수 없습니까? –

답변

2

WHERE 절에서 사용자 지정 문을 전달하는 추가 메서드를 사용하여 하나의 쿼리에서이 작업을 수행 할 수 있습니다. 구문은 MySQL의 이외의 백엔드에 다소 차이가있을 수 있습니다

f = { 
    'user_table': User._meta.db_table, 
    'action_table': Action._meta.db_table, 
    'user_id': User._meta.pk.get_attname_column()[1], 
    'user_fk': Action._meta.get_field('user').get_attname_column()[1], 
    'timestamp': Action._meta.get_field('timestamp').get_attname_column()[1], 
} 

query = "(SELECT COUNT(*) FROM %(action_table)s \ 
    WHERE %(action_table)s.%(user_fk)s = %(user_table)s.%(user_id)s \ 
    AND DAYOFWEEK(%(action_table)s.%(timestamp)s IN (1,7)) \ 
    <= (SELECT COUNT(*) FROM %(action_table)s \ 
    WHERE %(action_table)s.%(user_fk)s = %(user_table)s.%(user_id)s \ 
    AND DAYOFWEEK(%(action_table)s.%(timestamp)s) NOT IN (1,7))" % f 
users = User.objects.extra(where=[query])) 

이 MySQL의 예는 주말 동안 작업의 수는 다른 날보다 작거나 행동의 수와 같다 모든 사용자를 선택합니다. 물론 상황에 따라 테이블과 컬럼 이름을 변경해야합니다.

+0

감사합니다.이 방법으로 인트로 스펙 션을 사용하여 컬럼/테이블 이름을 얻고 쿼리를 작성하십시오. – Shark

+0

컬럼/테이블 이름을 얻기위한 내포 (inrospection)가 포함되도록 내 대답이 업데이트되었습니다. – knbk