在 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 中,我想在已经排序的查询集中获取特定元素及其几个邻居的主要内容,如果未能解决你的问题,请参考以下文章

在Django查询中获取当前选择之前和之后的记录

从 django 的查询集中获取第一个对象的最快方法?

获取查询集的当前 order_by 排序

在 django 查询集中的两个日期之间有可能获得几个月?

是否可以将多个数据库中的多个 django 查询集合并到一个查询集中?

在 django 的查询集中获取对象的计数