python - Django 模型查询最接近的整数匹配

标签 python django django-queryset

我得到了一些具有不同评分字段值的 Django 模型对象:

puzzles_rating = [0, 123, 245, 398, 412, 445, 556, 654, 875, 1000]
    for rating in puzzles_rating:
        puzzle = Puzzle(rating=rating)
        puzzle.save()

现在,对于 user_rating = 500,我想选择评分最接近的拼图。在上面的例子中,它应该是等级为 445 的谜题 #6。

问题是我不能这样做:

puzzle = Puzzle.objects.filter(rating__lte=user_rating).order_by('-rating')[0]

因为一般来说,我最接近的匹配评分可能高于目标评分。

有没有方便的方法从两个方向查询最接近的匹配项?

最佳答案

你可以使用extra方法:

puzzle = Puzzle.objects.extra(select={
    'abs_diff': 'ABS(`rating` - %s)',
}, select_params=(rating,)).order_by('abs_diff').first()

从 Django 1.8 开始你不需要编写原始 SQL,你可以使用 Func:

from django.db.models import Func, F

    puzzle = Puzzle.objects.annotate(abs_diff=Func(F('rating') - rating, function='ABS')).order_by('abs_diff').first()

关于python - Django 模型查询最接近的整数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305265/

相关文章:

python - 通过 Pandas 中两行的值将行转换为列

python - 如何使用 xmlrpclib 将 client_address 公开给所有方法?

python - 模块 'networkx' 没有属性 'blockmodel'?

django - 为什么 Django 的 DetailView 没有可重用的模板?

Django i18n : makemessages only on site level possible?

python - 获取一个 QuerySet 并按相关表的值之和对其进行排序

django queryset - 搜索名字和姓氏

python - 如何在 Django 中使用内联表单集删除模型对象

django - 为什么我收到 django Rest Framework swagger 的 "no module named urls"错误?

Django 按升序排序查询集