2012-09-03 15 views
6

Soy nuevo en Django y estoy tratando de utilizar la función de modelo get_or_create pero me da un error, incluso tengo el atributo en mi modeloDjango get_or_create retorno de error: 'tupla' objeto no tiene atributo

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 

Modelo

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) 

Aquí estoy tratando de buscar para comprobar si hay valor existente, de lo contrario crear y guardar nuevos

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

¿Qué pasa?

Respuesta

26

get_or_create no se limita a devolver el objeto:

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.

En su caso d se le ha asignado esta tupla en lugar del objeto que se esperaba, por lo que se obtiene el error atributo. Puede corregir su código cambiándolo a:

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

Las siguientes dos líneas me parecen innecesarias. La llamada anterior get_or_create asegura que d.dias=diaSemana, por lo que no es necesario volver a asignarla. Probablemente no sea necesario llamar al save tampoco.

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

en lugar de esto:

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

hacer:

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

como dijo @Alasdair, el primero en la tupla es el objeto

Cuestiones relacionadas