Python 如何使用链表查找django中的下一个和上一个对象?

Python 如何使用链表查找django中的下一个和上一个对象?,python,django,django-models,Python,Django,Django Models,假设一个问答网站。在结束点打开问题时,还应提供指向下一个问题的链接。假设表的顺序是pk值或时间戳 这可以通过创建一个我现在正在使用的方法来简单地解决: def next_q(self): # Ques model contain all questions # this method is a model method of Ques all_q = Ques.objects.all() q = None count = 1 if count &l

假设一个问答网站。在结束点打开问题时,还应提供指向下一个问题的链接。假设表的顺序是pk值或时间戳

这可以通过创建一个我现在正在使用的方法来简单地解决:

def next_q(self):
    # Ques model contain all questions
    # this method is a model method of Ques
    all_q = Ques.objects.all()
    q = None
    count = 1
    if count < all_q.count():
        try:
            q = all_q.get(pk=self.pk + count)
            break
        except ObjectDoesNotExist:
            count += 1
    return q

每当创建、编辑或删除新对象时,这些都会更新。这确保了我只查询一个对象。然而,我想知道这是否是一个好方法。如果不是,我还能做什么?

使用链表的方法是可行的,但是您不需要更改数据模型来支持所需的内容。相反,您可以简单地为大于主键的所有问题创建一个光标,然后阅读第一个问题

请记住,objects.all()实际上并不读取所有对象。它只需创建一个指向数据的游标。您可以将光标视为数据库关于如何检索数据的“行动计划”。只有当您实际获取数据时,它才会开始读取数据库记录

您需要的基本上是sql中的这一点

select * from Question where pk > question.pk order by pk
在django,这将类似于

all_q = Ques.objects.all()
all_q.filter(pk__gt=question.pk)
all_q.order_by('pk')  # not really necessary as this is done implicitly
next_q = all_q.first()

对于上一条记录,您也可以这样做,但是使用相反的顺序,或者只调用“last”而不是first。

在有序结构上使用链表是没有意义的,因为您的数据库已经为您提供了一个有序的记录列表,您可以通过根据需要对数据进行排序来访问任何您想要的项目

这里有一个方法,它将返回您想要的

class Ques(型号):
....
@类方法
def get_next(cls,当前_id):#当前_id是当前记录的id
尝试:
返回cls.objects.filter(id\u gt=current\u id).order\u by(“id”)[0]
除:
一无所获
@类方法
def get_PREVICE(cls,当前_id):
尝试:
返回cls.objects.filter(id\u lt=current\u id).order\u by(“-id”)[0]
除:
一无所获
在这里使用更有用,您只需获取下一条或上一条最近的记录。如果没有记录,则得到
None

all_q = Ques.objects.all()
all_q.filter(pk__gt=question.pk)
all_q.order_by('pk')  # not really necessary as this is done implicitly
next_q = all_q.first()