Vad*_*nov 4 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()
Run Code Online (Sandbox Code Playgroud)
现在,对于a user_rating = 500,我想选择最接近评分的拼图.在上面的情况下,它应该是#6拼图,评级为445.
问题是我不能这样做:
puzzle = Puzzle.objects.filter(rating__lte=user_rating).order_by('-rating')[0]
Run Code Online (Sandbox Code Playgroud)
因为,一般来说,我最接近的匹配等级可能高于目标等级.
有没有方便的方法从两个方向查询最接近的匹配?
您可以使用以下extra方法:
puzzle = Puzzle.objects.extra(select={
'abs_diff': 'ABS(`rating` - %s)',
}, select_params=(rating,)).order_by('abs_diff').first()
Run Code Online (Sandbox Code Playgroud)
从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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1229 次 |
| 最近记录: |