繁体   English   中英

Django 在查询集中查找项目并获取下一个

[英]Django find item in queryset and get next

我正在尝试使用 object,查找一个查询集,在该查询集中找到该项目,然后找到下一个。

@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]

当我将它添加到 model 并运行它时,这是我为一个实例的每个变量得到的结果。

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

我错过了什么/我犯了什么愚蠢的错误?

在您的 function 中, contacts是一个QuerySet 实际的对象未在该行中获取:

contacts = Model.objects.filter(owner=self.owner).order_by('-date')

因为您没有使用像list()这样的 function ,所以您还没有迭代 QuerySet ...稍后对其进行评估。 这可能是您的问题的原因。

由于您需要在联系人列表中搜索 ID 并在该列表中查找下一个 object,我认为没有办法只能获取所有联系人并使用经典的 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)

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

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

@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
    ''')

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM