第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django創(chuàng)建沒有表單的實(shí)例模型

Django創(chuàng)建沒有表單的實(shí)例模型

胡子哥哥 2021-11-09 19:28:29
我正在嘗試創(chuàng)建“Partita”模型的實(shí)例,但我不想手動設(shè)置帶有表單的字段;我需要使用一個隨機(jī)整數(shù)來設(shè)置字段(它們是兩個外鍵),該整數(shù)指的是外鍵的 id。這是為了創(chuàng)建一種足球比賽的創(chuàng)建者,其中“Partita”(意大利語比賽)由 team1 和 team2(在我的代碼“casa”和“trasferta”中)組成,我該怎么做?我試過這個,但它拋出:找不到頁面,沒有 FantaSquadra 匹配給定的查詢。視圖.py:def createPartite(request):    num1=0    num2=0    gior=0    while num1==num2:        num1 = str(random.randint(1,3))        num2 = str(random.randint(1,3))        if num1!=num2:            gior=gior+1    cas= get_object_or_404(FantaSquadra, pk=num1)    tra= get_object_or_404(FantaSquadra, pk=num2)    partita = Partita.creaP(cas,tra)    partita.save()    contesto = {        'partita': partita    }    return render(request, 'sondaggio/partite.html',contesto)模型.py:class FantaSquadra(models.Model):    proprietario = models.ForeignKey(User, on_delete=models.CASCADE,unique=True)    nome_fantasquadra = models.CharField(max_length=200,unique = True)    punteggio = models.IntegerField(default=0)    def __str__(self):        return self.nome_fantasquadraclass Partita(models.Model):    giornata = models.IntegerField(default=1)    casa=models.ForeignKey(FantaSquadra,on_delete=models.CASCADE, related_name='fantasquadra_casa', unique=True)    traferta = models.ForeignKey(FantaSquadra, on_delete=models.CASCADE, related_name='fantasquadra_trasferta', unique=True)    def __str__(self):        return "giornata "+str(self.giornata)    def creaP(self,cas,trasfert):        self.casa = cas        self.traferta = trasfert        return self
查看完整描述

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é)省你很多時間和痛苦。


查看完整回答
反對 回復(fù) 2021-11-09
  • 1 回答
  • 0 關(guān)注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號