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 = 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
我错过了什么/我犯了什么愚蠢的错误?
解决方案
在您的函数中,联系人是一个QuerySet。实际的对象未在该行中获取:
contacts = Model.objects.filter(owner=self.owner).order_by('-date')
因为您不使用类似的函数list()
,所以您还没有迭代 QuerySet ......稍后会对其进行评估。这可能是您的问题的原因。
由于您需要在联系人列表中搜索 ID 并在该列表中查找下一个对象,我认为没有办法只能获取所有联系人并使用经典的 Python 循环来查找您的对象。
@property
def next_object_url(self):
contacts = list(Model.objects.filter(owner=self.owner).order_by('-date').all())
for curr_contact, next_contact in zip(contacts[:-1], contacts[1:]):
if curr_contact.id == self.id:
return next_contact
else:
# not found
raise ContactNotFoundError(self.id)
另一种解决方案是更改您的数据库模型,以便在数据库级别添加上一个/下一个联系人的概念……</p>
推荐阅读
- php - PHPMailer 在本地主机上运行良好,但在实时服务器上运行良好
- python - Heroku 没有名为“boto3”的模块
- android - 如何解决 Flutter Agora RTC 显示错误代码 110
- tensorflow - 不显示 GPU,使用 anaconda 安装了 tensroflow
- javascript - Javascript 中的“事件”已被弃用,我不能使用“preventDefault()”
- angular - 角度引导 getelmentbyId 返回 NULL
- r - 由最大统计方法控制的家庭明智错误率
- babeljs - regenerator.mark 不是一个函数 svelte + rollup + babel
- android - RecyclerView 的 ItemAnimator 不起作用
- apache - 如果不存在,则在重写后添加正斜杠