在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居
Posted
技术标签:
【中文标题】在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居【英文标题】:In django, I want to get a specific element and its a few neighbors in the query set which is already sorted 【发布时间】:2016-03-11 14:30:20 【问题描述】:在我的数据库中,我有一本用户手册,我想根据他们的分数(用户的属性)对他们进行排名,但我只想让知道该用户 ID 的特定用户的几个邻居。例如,两个用户的分数刚好比他高,两个比他低。我不需要知道所有的排名,只知道其中的一部分。有没有比遍历列表并定位元素更有效的方法呢?非常感谢任何帮助。
这是model.py。
from django.db import models
class User(models.Model):
openid = models.CharField(max_length=30)
nickname = models.CharField(max_length=30)
score = models.IntegerField()
这里是查询:objects = User.objects.all().order_by('-score')
def get_partial_ranklist(openid, objects):
l = objects.len()
entries = []
n = 0
for item in objects:
if item.openid == openid:
break
else:
n += 1
if n == 0:
indexlist = [0, 1, 2, 3]
elif n == l - 1 or n == l - 2:
indexlist = [l - 4, l - 3, l - 2, l - 1]
else:
indexlist = [n - 1, n, n + 1, n + 2]
if l <= 4:
indexlist = range(l)
for i in indexlist:
entry_object = objects[i]
entry =
"openid": entry_object.openid,
"nickname": entry_object.nickname,
"score": entry_object.score_today,
"rank": i+1
entries.append(entry)
return entries
【问题讨论】:
感谢您的意见。这是我第一次提出问题,我真的希望下次做得更好...... 【参考方案1】:假设你有你的用户models
:
from django.db import models
class User(models.Model):
name = models.CharField(max_length=200, blank=True)
score = models.IntegerField() # score
def __str__(self):
return self.score
然后在查询中:
the_id = 3 # you said this one you already know
_score = User.objects.get(id=the_id).score
_list = User.objects.filter(score__gt=_score)[:2] + User.objects.filter(score__lt=_score)[:2]
_list
是你想要的。
官方文档建议:Limiting QuerySets
【讨论】:
非常感谢您的回答,它比我的要简短得多。与我的方法相比,它的效率如何?以上是关于在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居的主要内容,如果未能解决你的问题,请参考以下文章