django+;postgres并选择distinct

django+;postgres并选择distinct,django,postgresql,django-models,Django,Postgresql,Django Models,我正在用postgres运行django,我需要从表中查询一些记录,按排名对它们进行排序,并获得关于外键的唯一条目 基本上,我的模型是这样的: class BookingCatalog(models.Model): ....... boat = models.ForeignKey(Boat, verbose_name=u"Boat", related_name="booking_catalog") is_skippered = models.BooleanField(u'Is

我正在用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,这会引发此异常:

选择“表达式上的不同项”必须按表达式匹配初始顺序


我该怎么做呢

。按秩排序将为您提供每个副本的最低秩,但您的总体查询结果将按船字段排序

BookingCatalog.objects.filter (...).order_by('boat','-rank','is_skippered').distinct('boat')
有关的更多信息,请参阅为Postgres收录。尝试使用以下方法:

BookingCatalog.objects.filter(...) \
                      .order_by('boat', '-rank', 'is_skippered') \
                      .distinct('boat')

我这样做的方式是首先选择不同的对象,然后使用这些结果过滤另一个查询集

# 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确认这一点,虽然