簡體   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