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

2024-06-13 11:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些Django模型对象具有不同的rating字段值:

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,我想选择最接近评级匹配的谜题。在上面的情况下,它应该是拼图6,评分445。在

问题是我不能只做:

^{pr2}$

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

有没有一种方便的方法可以从两个方向查询最接近的匹配?在


Tags: 对象djangoin模型forsave情况评分
2条回答

您可以使用extra方法:

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

从django1.8起,您不需要编写原始SQL,可以使用Func

^{pr2}$

您可以获得两个谜题对象并在Python中进行比较,其中比较接近:

# Note, be sure to check that puzzle_lower and puzzle_higher are not None
puzzle_lower = Puzzle.objects.filter(rating__lte=user_rating).order_by('-rating').first()
puzzle_higher = Puzzle.objects.filter(rating__gte=user_rating).order_by('rating').first()

# Note that in a tie, this chooses the lower rated puzzle
if (puzzle_higher.rating - user_rating) < abs(puzzle_lower.rating - user_rating):
    puzzle = puzzle_higher
else:
    puzzle = puzzle_lower

相关问题 更多 >