django get_or_create返回错误:'tuple'对象没有属性

dex*_*vip 15 django django-models

我是django的新手,我正在尝试使用get_or_create模型函数但是我得到了一个错误,即使我的模型中有属性

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
Run Code Online (Sandbox Code Playgroud)

模型

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) 
Run Code Online (Sandbox Code Playgroud)

在这里,我试图搜索以检查是否存在现有值,否则创建新的并保存

for diaSemana in diaSemanas:
        d = DiaSemana.objects.get_or_create(dias=diaSemana)
        d.dias = diaSemana;
        d.save() 
        c.save()
        c.diaSemana.add(d);
Run Code Online (Sandbox Code Playgroud)

怎么了?

Ala*_*air 40

get_or_create 不只是返回对象:

返回一个元组(object, created),其中object是检索或创建的对象,并且创建的是一个布尔值,指定是否创建了新对象.

在你的情况下d已经分配了这个元组而不是你期望的对象,所以你得到属性错误.您可以通过将代码更改为:来修复代码:

d, created = DiaSemana.objects.get_or_create(dias=diaSemana)
Run Code Online (Sandbox Code Playgroud)

我不需要以下两行.get_or_create上面的调用确保了d.dias=diaSemana,因此不需要再次分配它.可能没有必要打电话save.

d.dias = diaSemana;
d.save()
Run Code Online (Sandbox Code Playgroud)