問題

對此程式碼的結構不滿意100%,但不幸的是我目前無法更改它.我正在Django中搜索一個大資料庫,由於技術限制,我必須儲存Q物件的列表,並使用Django的reduce()函式將Q物件合併為一個Queryset.我目前有一個模型,如:

 class Obj(models.Model):
    id_number = models.CharField(max_length=128)
    modified = models.DateField('%Y-%m-%d', default='1900-01-01')
 

我目前正在使用以下程式碼來選擇列表中存在id_number的行,latest_ids:

 split_queries = []
for id_num in latest_ids:
    split_queries.append(Q(id_number=id_num))
result = Obj.objects.filter(reduce(operator.or_, split_queries))
 

這是我預期的工作,但我只想保留id_number=id_num和日期modified是最新的行.我已經看到了解決方案,例如使用Django的aggregate()函式或latest()函式,但我無法弄清楚如何使用Q物件.我希望Q物件,例如

 Q(id_number=id_num, Max('modified'))
 

在Django中使用Q物件是否可能這樣的行為?

編輯 我正在使用SQLite的系統.資料庫很大,過去使用Too Many SQL variables(SQLite只允許1000)執行問題,對於選擇許多id_numbers的查詢,將查詢分解為較小的Q物件組解決了這些問題.

資料庫有許多不同的id_number s,但許多行具有相同的id_number s.我希望能夠,對於latest_id s中的每一行,選擇與id_number匹配的單行,並具有最新的modified日期(或多行,如果日期相同).

  最佳答案

首先我不明白你的Q. Obj.objects.filter(id_number__in=latest_ids)給你id_numberlatest_ids之一的行.

編輯:似乎需要為您的用例保留Q()查詢.在這種情況下,不可能在Q()過濾器中新增您想要的內容.

但分組和註釋結果查詢可能不是這樣的問題.嘗試這個:

 Obj.objects.filter(reduce(operator.or_, split_queries))\
    .values('id_number').annotate(latest_modified=Max('modified'))
 

  相同標籤的其他問題

pythondjangodate