Python Django在queryset中查找项并获取下一个

Python Django在queryset中查找项并获取下一个,python,django,Python,Django,我试图获取一个对象,查找查询集,在该查询集中找到该项,然后找到下一项 @property def next_object_url(self): contacts = Model.objects.filter(owner=self.owner).order_by('-date') place_in_query = list(contacts.values_list('id', flat=True)).index(self.id) next_contact = contact

我试图获取一个对象,查找查询集,在该查询集中找到该项,然后找到下一项

@property
def next_object_url(self):
    contacts = Model.objects.filter(owner=self.owner).order_by('-date')
    place_in_query = list(contacts.values_list('id', flat=True)).index(self.id)
    next_contact = contacts[place_in_query + 1]
当我将它添加到模型并运行它时,下面是我为一个实例的每个变量得到的结果

CURRENT = Current Object
NEXT = Next Object

contacts.count = 1114
self.id = 3533 #This is CURRENT.id
place_in_query = 36
contacts[place_in_query] = NEXT
next_contact = CURRENT
我遗漏了什么/我犯了什么愚蠢的错误?

在您的功能中,联系人是一个。实际对象不会在以下行中提取:

contacts=Model.objects.filter(owner=self.owner).order_by('-date'))
因为您没有使用像
list()
这样的函数,所以还没有迭代查询集。。。稍后将对其进行评估。这可能就是你的问题所在

由于您需要在联系人列表中搜索一个ID,并在该列表中查找下一个对象,因此我认为除了获取所有联系人并使用经典的Python循环来查找您的对象之外,没有其他方法

@属性
定义下一个对象url(自身):
contacts=list(Model.objects.filter(owner=self.owner)。order_by('-date')。all())
对于当前联系人,zip中的下一个联系人(联系人[:-1],联系人[1:]):
如果curr_contact.id==self.id:
返回下一个联系人
其他:
#找不到
引发ContactNotFoundError(self.id)
另一个解决方案是更改数据库模型,以便在数据库级别添加上一个/下一个联系人的概念…

在您的函数中,联系人是一个。实际对象不会在以下行中提取:

contacts=Model.objects.filter(owner=self.owner).order_by('-date'))
因为您没有使用像
list()
这样的函数,所以还没有迭代查询集。。。稍后将对其进行评估。这可能就是你的问题所在

由于您需要在联系人列表中搜索一个ID,并在该列表中查找下一个对象,因此我认为除了获取所有联系人并使用经典的Python循环来查找您的对象之外,没有其他方法

@属性
定义下一个对象url(自身):
contacts=list(Model.objects.filter(owner=self.owner)。order_by('-date')。all())
对于当前联系人,zip中的下一个联系人(联系人[:-1],联系人[1:]):
如果curr_contact.id==self.id:
返回下一个联系人
其他:
#找不到
引发ContactNotFoundError(self.id)

另一个解决方案是更改您的数据库模型,以便在数据库级别添加上一个/下一个联系人的概念…

我不确定为什么您的代码不起作用,但我认为有更好的方法,使用原始查询:

@property
def next_object_url(self):
    contacts = Model.objects.raw(f'''
      SELECT 
      t1.id, 
      DATEDIFF((SELECT t2.date FROM table t2 WHERE t2.id = {self.id}), t1.date) as d
      from table t1
      ORDER BY d asc
      LIMIT 2
    ''')

这是完全未经测试的,可能必须针对您的特定数据库进行调整。希望您的数据库支持

我不知道为什么您的代码不起作用,但我认为有一种更好的方法,使用原始查询:

@property
def next_object_url(self):
    contacts = Model.objects.raw(f'''
      SELECT 
      t1.id, 
      DATEDIFF((SELECT t2.date FROM table t2 WHERE t2.id = {self.id}), t1.date) as d
      from table t1
      ORDER BY d asc
      LIMIT 2
    ''')

这是完全未经测试的,可能必须针对您的特定数据库进行调整。希望您的数据库支持

你能使用一个更窄的过滤器,只找到几个实例,然后打印整个列表吗?这可能会说明问题所在。您是否可以使用一个更窄的过滤器,只查找少数实例,然后打印整个列表?这也许能说明问题所在。