2011-09-09 77 views
1

我有一个表有很多记录,我正试图创建一个复杂的查询,并希望在这里获得一些帮助。Django中的子查询存在的复杂查询

models.py

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') 

查询

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

想从投票返回记录,其中CREATED_BY不是null,CREATED_BY了他的第一票。意思是,如果用户进行了第一次投票,我只想返回投票记录。

我不知道如何做这样的事情,通常情况下,在SQL,我会做一个子查询和统计用户投票,如果他们是平等的一个然后返回记录。

任何想法我会怎么做,与Django模型?

+0

这个问题是类似的。它可能会帮助你:http://stackoverflow.com/questions/327807/django-equivalent-for-count-and-group-by –

+0

这篇文章是关于从一个查询集分组结果。在我的情况下,我想过滤查询集只返回第一个条目,在正常的SQL可以完成子查询计数。但是,即使我在这里使用子查询计数,我也无法将子查询中的用户争论作为过滤器来传递。 –

回答

0

为此,您可以用分组的.values.aggregate相结合的方法。

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

一旦你的,如果你想获得实际Vote情况,你需要做的另一个查询,并使用上述退回的ID。

有关它的更多信息,请上aggregate and values Django的帮助部分。

0

试着左加入投票本身on left_vote.created_by==right_vote.created_by and left_vote.id!=right_vote.id和过滤那些对联接的右边用NULL的记录。