我有一个包含许多记录的表,我正在尝试创建一个复杂的查询,并希望在这里提供一些帮助。
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 :(得分: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
并过滤连接右侧有空值的记录。