2012-09-03 10 views
6

Sono nuovo di Django e sto cercando di usare la funzione di modello get_or_create ma ottengo un errore anche io avere l'attributo nel mio modellodjango get_or_create errore di ritorno: 'tupla' oggetto non ha attributo

AttributeError at /professor/adicionar-compromisso 
'tuple' object has no attribute 'dias' 
Request Method: POST 
Request URL: http://localhost:8000/professor/adicionar-compromisso 
Django Version: 1.4.1 
Exception Type: AttributeError 
Exception Value:  
'tuple' object has no attribute 'dias' 
Exception Location: c:\htdocs\rpv\GerenDisponibilidade\professor\models.py in inserirCompromisso, line 63 
Python Executable: C:\Python27\python.exe 
Python Version: 2.7.3 
Python Path:  
['c:\\htdocs\\rpv\\GerenDisponibilidade', 
'C:\\Python27\\lib\\site-packages\\distribute-0.6.27-py2.7.egg', 
'C:\\Python27\\lib\\site-packages\\pip-1.1-py2.7.egg', 
'C:\\Python27\\lib\\site-packages\\sphinx-1.1.3-py2.7.egg', 
'C:\\Python27\\lib\\site-packages\\docutils-0.9.1-py2.7.egg', 
'C:\\Python27\\lib\\site-packages\\jinja2-2.6-py2.7.egg', 
'C:\\Python27\\lib\\site-packages\\pygments-1.5-py2.7.egg', 
'C:\\Windows\\system32\\python27.zip', 
'C:\\Python27\\DLLs', 
'C:\\Python27\\lib', 
'C:\\Python27\\lib\\plat-win', 
'C:\\Python27\\lib\\lib-tk', 
'C:\\Python27', 
'C:\\Python27\\lib\\site-packages', 
'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info'] 
Server time: Seg, 3 Set 2012 17:57:17 -0300 

Modello

class DiaSemana(models.Model):  
DIAS_CHOICES = (
       ("Seg", "Segunda-Feira"), 
       ("Ter", "Terça-Feira"), 
       ("Qua", "Quarta-Feira"), 
       ("Qui", "Quinta-Feira"), 
       ("Sex", "Sexta-Feira"), 
       ("Sab", "Sábado"), 
       ("Dom", "Domingo"), 
       )   
dias = models.CharField(max_length=20, choices=DIAS_CHOICES) 

Qui sto cercando di ricerca per verificare se v'è valore esistente, altrimenti creare nuovi e salvare

for diaSemana in diaSemanas: 
     d = DiaSemana.objects.get_or_create(dias=diaSemana) 
     d.dias = diaSemana; 
     d.save() 
     c.save() 
     c.diaSemana.add(d); 

Cosa c'è che non va?

risposta

26

get_or_create non significa solo restituire l'oggetto:

Returns a tuple of (object, created) , where object is the retrieved or created object and created is a boolean specifying whether a new object was created.

Nel tuo caso d è stato assegnato questo tupla invece dell'oggetto che vi aspettavate, in modo da ottenere l'errore attributo. È possibile correggere il codice modificandolo in:

d, created = DiaSemana.objects.get_or_create(dias=diaSemana) 

Le seguenti due righe non mi sembrano necessarie. La chiamata get_or_create sopra assicura che d.dias=diaSemana, quindi non è necessario assegnarlo di nuovo. Probabilmente non c'è bisogno di chiamare lo save.

d.dias = diaSemana; 
d.save() 
1

invece fuori questo:

dias = models.CharField(max_length=20, choices=DIAS_CHOICES) 

fare:

dias = models.CharField(max_length=20, choices=DIAS_CHOICES)[0] 

come detto @Alasdair, il primo nel tupla è l'oggetto

Problemi correlati