django中存在子查询的复杂查询

时间:2011-09-09 17:36:39

标签: 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模型做到这一点?

2 个答案:

答案 0 :(得分: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帮助部分。

答案 1 :(得分:0)

尝试将Vote连接到自身on left_vote.created_by==right_vote.created_by and left_vote.id!=right_vote.id并过滤连接右侧有空值的记录。