我正在使用postgres运行django,我需要从表中查询一些记录,按等级对它们进行排序,并获得关于外键的唯一条目。
基本上我的模型是这样的:
class BookingCatalog(models.Model):
.......
boat = models.ForeignKey(Boat, verbose_name=u"Boat", related_name="booking_catalog")
is_skippered = models.BooleanField(u'Is Skippered',choices=SKIPPER_CHOICE, default=False)
rank = models.IntegerField(u"Rank", default=0, db_index=True)
.......
想法是运行这样的东西
BookingCatalog.objects.filter (...).order_by ('-rank', 'boat', 'is_skippered').distinct ('boat')
不幸的是,由于我使用postgres引发了这个异常,因此无效:
SELECT DISTINCT ON表达式必须与初始ORDER BY表达式匹配
我该怎么做?
答案 0 :(得分:4)
The distinct argument has to match the first order argument。试试这个:
BookingCatalog.objects.filter(...) \
.order_by('boat', '-rank', 'is_skippered') \
.distinct('boat')
答案 1 :(得分:0)
.. -rank的排序将为您提供每个重复的最低排名,但您的整体查询结果将按船区排序
BookingCatalog.objects.filter (...).order_by('boat','-rank','is_skippered').distinct('boat')
有关详细信息,请参阅Django documentation 包括Postgres
答案 2 :(得分:0)
我这样做的方法是先选择不同的对象,然后使用这些结果过滤另一个查询集。
# Initial filtering
result = BookingCatalog.objects.filter(...)
# Make the results distinct
result = result.order_by('boat').distinct('boat')
# Extract the pks from the result
result_pks = result.values_list("pk", flat=True)
# Use those result pks to create a new queryset
restult_2 = BookingCatalog.objects.filter(pk__in=result_pks)
# Order that queryset
result_2 = result_2.order_by('-rank', 'is_skippered')
print(result_2)
我相信这会导致执行一个包含子查询的单个查询。我希望有一个对Django有更多了解的人来确认这一点。