我使用Django 1.9.10:爲什麼Django MultipleObjectsReturned錯誤佔用內存?
我有一個名爲Details
模型具有unique_id
列被編入索引:
try:
detail = Detail.objects.get(unique_id=UUID)
except MultipleObjectsReturned as m:
logger.error("uuid {} returned multiple objects - {}".format(UUID, str(m)))
由於一些錯誤代碼UUID=None
這導致越來越引發MultipleObjectsReturned
錯誤。但我們注意到幾乎2GB的內存已經用完了,並且使系統速度下降很多。
在錯誤日誌中,我們發現印刷STR(米)以下錯誤
MultipleObjectsReturned:get()方法返回一個以上的詳細信息 - 它返回451424!
我的問題是爲什麼Django在內存中提取這麼多數據只是爲了引發錯誤? Django可以取數?
我知道我可以使用filter()來解決這個問題,但我只是爲此感到驚訝,並且想明白爲什麼django會這樣做?
用過濾器查詢上的limit()修改get()是不是個好主意。然後只是說get()返回多個結果,跳過計數部分並避免因爲沒有將太多記錄帶入內存而導致系統崩潰 – Crazyshezy
@Crazyshezy你可以提交一個票據和一個補丁到Django項目,如果你認爲它是一個寶貴的改進。 –
@Crazyshezy所以這很有趣。在1.7中,他們有你在推薦的限制。不知道他們爲什麼後來刪除它。在https://github.com/django/django/blob/stable/1.7.x/django/db/models/query.py查看代碼 – saurabh