1 回答

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個贊
首先(部分無關(guān)但不完全),你不應(yīng)該get_object_or_404()在這里使用。此函數(shù)只是詳細(xì)視圖中遞歸代碼模式的簡單快捷方式(嘗試獲取模型實(shí)例并在未找到時返回 404 HTTP 響應(yīng))。檢索模型實(shí)例的正確方法是YourModel.objects.get(pk=xxx),YourModel.DoesNotExist如果找不到匹配的記錄,它將引發(fā)異常。
第二點(diǎn)(部分無關(guān)但很好),您的視圖應(yīng)該只接受 POST 請求 - GET 請求不得修改服務(wù)器狀態(tài)。
現(xiàn)在問/您的問題:您當(dāng)然只能使用現(xiàn)有的 FantaSquadra 記錄,并且不能保證您的隨機(jī)數(shù)與現(xiàn)有的 pk 匹配。你可以用蠻力的方式解決它:
while True:
num = random.randint(1,3)
try:
obj = FantaSquadra.objects.get(pk=num)
break
except FantaSquadra.DoesNotExist:
continue
但這會非常低效。一個更簡單的解決方案是從現(xiàn)有FantaSquadra pk 列表中隨機(jī)挑選一個 pk :
pks = list(FantaSquadra.objects.values_list("pk", flat=True))
num = random.choice(pks)
# now you're garanteed to have a matching object
obj = FantaSquadra.objects.get(pk=num)
作為一個額外的好處,您現(xiàn)在可以通過在選擇記錄之前過濾您的查詢集來限制潛在的候選人。
編輯:
此外,您的Partita.creaP()方法顯然是錯誤的——它不“創(chuàng)建”任何東西,它只更新當(dāng)前實(shí)例的casa和traferta屬性Partita(并且不保存它)。它也沒有用,因?yàn)?Django 查詢集已經(jīng)提供了一種創(chuàng)建(真正創(chuàng)建)新記錄的方法,非常令人驚訝的是,它命名為 'create()`:
partita = Partita.objects.create(casa=cas,traferta=tra)
至于您收到的錯誤消息:您的creaP()方法是一個實(shí)例方法,因此應(yīng)該在實(shí)例上調(diào)用它(在這種情況下,Python 會自動將您調(diào)用該方法的實(shí)例作為第一個('self')參數(shù)傳遞) ,不在課堂上。好吧,你也可以在類上調(diào)用它,但是你必須明確地傳遞一個Partita實(shí)例——這意味著你必須首先創(chuàng)建一個。只是路過尚未定義的名稱之前,只能導(dǎo)致一個NameError明顯。
請不要冒犯,但看起來您并不真正了解自己在做什么,只是嘗試任何事情直到它似乎起作用為止。這種編程方法是眾所周知的反模式,實(shí)際上,它行不通。我建議你花點(diǎn)時間學(xué)習(xí)Python(做官方教程+瀏覽文檔)和Django(同上),這會節(jié)省你很多時間和痛苦。
添加回答
舉報(bào)