0

背景:

我想知道如何根据首先匹配请求的项目,然后默认为所有不匹配项目的原始排序方案来实现 Django 查询集的一些高级排序。

可以说我有以下内容:

possibleLanguages = ["English", "Spanish", "Armenian", "French", "Chinese", "Swahili"]
requestedLanguage = "Armenian"

class Book(models.Model):
    name = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    languages_available = models.CharField(max_length=1000) #Comma Separated List of languages

#Pseudocode Query
queryset = Book.objects.all().order_by(sortByRequestLanguage(requestedLanguage),
                                       sortByTotalNumLanguagesAvailable(),
                                       sortByAllPossibleLanguages()
                                      )

问题:

如何通过以下方式对生成的 Book 查询集进行
排序: 1. 根据是否与指定语言匹配对所有对象进行
排序 2. 按可用语言的总数对 (1) 的
所有排序对象进行排序 3. 按全部对 (2) 的所有排序对象进行排序possibleLanguages 中的其他语言

4

1 回答 1

1

这是一个相当复杂的排序。我将尝试解决方案。你肯定需要做一些原始的 sql,所以我将以 PostGres 为例。首先,您需要在查询中添加一列来进行排序。然后,只需对该列进行排序。这是我的例子:

Book.object.extra(
    select={'sort': 'CASE WHEN name LIKE %s THEN 0 ELSE array_length(string_to_array(name, ','), 1) + 1 END',
    select_params=['%' + requestedLanguage + '%']
).order_by('sort')

需要注意的几点:

  1. 如果requestedLanguage 是languages_available 逗号分隔的语言,那Book将首先排序。(订单 0)
  2. 接下来,其他所有内容都将按语言可用的计数进行排序。
  3. 至于你要求的第三种,我不确定你到底想要什么。我很困惑,因为该字段实际上是一个语言列表。
  4. 我认为如果languages_available 是另一个语言表的manytomany 字段,那么排序可能会更容易。
  5. 最后,我不确定您是否可以.order_by()在创建的列上.extra()使用您可能需要使用.raw()查询。

我不确定这是否对你有用,但希望它能把你推向正确的方向。

于 2013-10-28T00:32:34.283 回答