在Django查询集中查找用户的最新评级

|| 我正在寻找一种方法来获取所有资源的特定人员的最新评分。 目前,我正在使用类似“ 0”的查询 然后将其通过带有资源和用户属性键的ѭ1传递,然后再以ѭ2进行查找。使用django queryset函数,有没有更优雅的方法呢? 这些是相关的模型。
class Person(models.Model):
    pass

class Resource(models.Model):
    pass

class Rating(models.Model):
    rating = models.IntegerField()
    timestamp = models.DateField()
    resource = models.ForeignKey(\'Resource\')
    user = models.ForeignKey(\'Person\')
我需要保留所有旧的Ratings,因为其他功能需要能够保持事物“变化”的历史。     
已邀请:
        对于您在这里寻找的内容,我不是100%清楚的,您是否要查找用户对其已评分的所有资源的最新评分?如果您可以提供有关ѭ1实际作用的详细信息,这将有助于阐明您要查找的内容。 您宁愿从资源角度来看:
resources = Resource.objects.filter(rating__user=person).order_by(\'-rating__timestamp\')
resource_rating = [(resource, resource.rating_set.filter(person=person).get_latest(\'timestamp\')) for resource in resources]
您也许可以使用Aggregate函数来获取每个资源的最新记录,或者巧妙地使用Q对象来限制SQ​​L请求(我的示例可能为您节省了一些请求,并且更加优雅,但并非如此简单)就像您可以通过原始SQL请求生成的内容一样)。在原始SQL中,您将使用内部的
SELECT
或执行良好的
GROUP BY
来获得最新的评级,因此最好模拟一下。 您还可以在Rating模型上创建一个post_save信号钩子和一个'active \'或\'current \'布尔字段,这将迭代与用户/资源匹配的其他评级,并将其'active \'字段设置为False。即post_save钩子将使用以下方式将所有其他等级标记为对用户/资源无效:
if instance.active:
    for rating in Rating.objects.filter(user=instance.user,resource=instance.resource).exclude(id=instance.id):
        rating.active=False
        rating.save()
然后,您可以对以下内容进行简单的查询:
Rating.objects.filter(user=person,active=True).order_by(\'-timestamp\')
这将是最经济的查询(即使您在原始SQL中进行了复杂的分组依据/内部选择,您所做的查询也比必要的更为复杂)。使用布尔值字段还意味着您可以为用户的评分提供“前进/后退” /“撤消/重做”行为(如果相关)。     

要回复问题请先登录注册