2014-03-29 2 views
2

나는 다음과 같은 모델이 있습니다복잡한 장고 모델 쿼리

class Vote(models.Model): 
    voter = models.ForeignKey(User) 
    target = model.ForeignKey(User) 
    timestamp = models.DateTimeField() 
    game = models.ForeignKey(Game) 
    step = model.IntegerField() 
    type = models.ForeignKey(VoteType) 

내가 가장 대상을 선정하고 관계의 경우에 초기 투표를받은 대상을 선택 선택해야합니다. 장고 ORM을 사용할 수 있습니까?

UPDATE : 사실 나는 투표 안에 또한 세 개 필드가 : game, turntype, 나는 주어진 이전의 제약에 따라 승자를 선택해야합니다 (I 위의 코드에 추가) 특정 game, turntype (.filter(game=1, step=2, type=3) 같은 즉, 무언가)

+0

django 모델 참조, https : //docs.djangoproject.com/en/dev/topics/db/models/ – WeizhongTu

+0

검색어 만들기 https://docs.djangoproject.com/en/dev/topics/db/queries/ – WeizhongTu

답변

3
당신은 주석 필드를 기준으로 투표 수와 각 사용자에 대한 최초의 투표 시간, 다음 순서를 선택하고 첫 번째 선택 주석을 사용할 수 있습니다

:

from django.db.models import Count, Min 

winner = User.objects.annotate(vote_count=Count('vote_set'))\ 
    .annotate(first_vote_time=Min('vote_set__timestamp'))\ 
    .order_by('-vote_count', 'first_vote_time')[0] 
을3210

UPDATE : 당신은 특정 게임에만 표를 계산하기 위해 다음과 같은 필터를 적용 할 수 있습니다

.filter(vote_set__game=game, vote_set__step=step, vote_set__type=type) 

이중 밑줄은 관련 개체의 속성을 필터링 할 수 있습니다.

주석 앞에 필터를 적용하여 정확한 투표 만 계산되도록하고 투표에 대한 모든 필터 조건이 동일한 필터 호출 내에 있는지 확인하십시오. 후자를해야하는 이유는 here입니다.

+0

'vote_set'은 무엇을 말합니까? (표의 투표?) – Sirion

+0

자, 이제 사용자에 대한 질의를하고 있음을 확인했습니다. 감사합니다! – Sirion

+0

불행히도 내 실제 문제 로이 솔루션을 확장하는 방법을 볼 수 없습니다 (내 질문에 업데이트 섹션을 참조하십시오). – Sirion