2011-09-09 3 views
1

많은 레코드가있는 테이블이 있으며 복잡한 쿼리를 만들고 여기에서 도움을 얻기를 바랍니다.django에서 복잡한 쿼리가 어디에서 하위 쿼리가 있습니까?

models.py CREATED_BY이 (가) 작성한가 null는 아니고, CREATED_BY이 (가) 작성한 그의 첫번째 투표를 만든 경우 암 투표에서 레코드를 반환하려고

all_votes = Vote.objects.filter(
    ~Q(created_by = None), 
) 

class Vote(models.Model): 
    is_annonymous = models.BooleanField(default=True) 
    vote   = models.IntegerField() 

    created_by  = models.ForeignKey(User, null=True, blank=True) 
    created_at  = models.DateTimeField(null=True, blank=True) 
    ip_address  = models.IPAddressField(null=True, blank=True) 


    #content type 
    content_type = models.ForeignKey(ContentType) 
    object_id  = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

쿼리. 의미, 나는 사용자가 첫 번째 투표를 한 경우에만 투표 기록을 반환하고 싶습니다.

SQL에서 이러한 작업을 수행하는 방법을 잘 모르겠다면 하위 쿼리를 실행하고 사용자 투표 수를 계산해야하며 둘 중 하나가 같으면 레코드를 반환해야합니다.

어떻게하면 장고 모델로 할 수 있을까요?

+0

이 질문은 유사합니다. 도움이 될 수도 있습니다 : http://stackoverflow.com/questions/327807/django-equivalent-for-count-and-group-by –

+0

이 게시물에 대한 쿼리 그룹화 결과입니다. 필자의 경우, queryset을 필터링하여 첫 번째 항목 만 리턴하고, 정규 sql에서 서브 쿼리 수를 사용하여 수행 할 수 있습니다. 하지만, 하위 쿼리 카운트를 여기 사용하더라도 하위 쿼리에서 사용자 arguement를 필터로 전달할 수는 없습니다. –

답변

0

.values.aggregate 방법을 조합하여이 그룹화를 수행 할 수 있습니다. 당신은 당신이 실제 Vote인스턴스을 받기를 원한다면 것을 일단

from django.db.models import Q, Min 
votes = Vote.objects.filter(~Q(created_by=None).values('created_by').aggregate(min=Min('created_at')) 

, 당신은 다른 질문을하고 ID를 위의 반환 사용해야합니다.

자세한 내용은 Django 도움말 섹션 (aggregate and values)을 확인하십시오.

0

시도하십시오. 자체적으로 투표 on left_vote.created_by==right_vote.created_by and left_vote.id!=right_vote.id에 투표하고 조인 오른쪽에 null이있는 레코드를 필터링하십시오.

관련 문제