我正在使用PostgreSQL作为Django项目的数据库。我有以下型号:
class Food(models.Model):
"""Stores a food entry"""
name = models.CharField(max_length=50)
image_id = models.CharField(max_length=20)
description = models.TextField()
class SurveyResult(models.Model):
"""Stores survey food result based on emoji and personality"""
emoji = models.CharField(max_length=10)
personality = models.CharField(max_length=50)
food = models.ForeignKey(Food, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now_add=True)
rating = models.PositiveSmallIntegerField(default=0)
我需要编写一个按'-timestamp'
排序的查询,然后只获取'food'
的不同值。这就是我所尝试的:
SurveyResult.objects.order_by('-timestamp').distinct('food')
但是,我得到以下错误:
ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT ON ("recommender_surveyresult"."food_id") "r...
我读了几个问题的答案,我发现一个答案基本上是这样的:
SurveyResult.objects.order_by('food', '-timestamp').distinct('food')
然而,我并没有得到我想要的东西,那就是最新的SurveyResult
对象,它们具有不同的food
。你知道吗
我怎样才能做到这一点?你知道吗
假设我的数据库中有下表:
# surveyresults
id emoji personality food timestamp rating
1 :) Famous US 1 2018-01-01 - 9:00 1
2 XD Famous CN 3 2018-01-01 - 9:10 2
3 :) Famous NZ 5 2018-01-01 - 9:15 3
4 :( Famous FR 5 2018-01-01 - 9:35 4
5 XD Famous US 1 2018-01-01 - 9:45 5
6 ;) Famous JP 4 2018-01-01 - 9:55 5
7 :o Famous SP 4 2018-01-01 - 10:00 5
查询应提供以下信息:
id emoji personality food timestamp rating
7 :o Famous SP 4 2018-01-01 - 10:00 5
5 XD Famous US 1 2018-01-01 - 9:45 5
4 :( Famous FR 5 2018-01-01 - 9:35 4
2 XD Famous CN 3 2018-01-01 - 9:10 2
我也想知道,是否有可能实现这一点只是一个查询。你知道吗
您可以使用
subquery
实现这一点,如下所示说明:
所以基本上
subquery
涉及对多个query
的求值,在您的例子中,我们正在求值两个查询。上述queryset
的SQL如下所示因此,首先内部(就像数学一样)查询求值,其结果将成为外部查询的输入,从而在不同的中生成最新的。阅读this了解更多信息。你知道吗
您可以考虑向SurveyResults模型添加一个元类,然后在那里指定您的顺序
相关问题 更多 >
编程相关推荐