22

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

モデル

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) 

ここでは、既存の値があるかどうかを確認するために検索しようとしています。そうでない場合は、新しい値を作成して保存します

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

どうしたの?

4

3 に答える 3

54

get_or_createオブジェクトを返すだけではありません:

のタプルを返します(object, created)。ここで、object は取得または作成されたオブジェクトであり、created は新しいオブジェクトが作成されたかどうかを指定するブール値です。

あなたの場合d、期待したオブジェクトではなくこのタプルが割り当てられているため、属性エラーが発生します。コードを次のように変更して修正できます。

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

次の 2 行は不要に思えます。上記のget_or_create呼び出しにより、 が保証されるd.dias=diaSemanaため、再度割り当てる必要はありません。電話する必要もおそらくないでしょうsave

d.dias = diaSemana;
d.save()
于 2012-09-03T21:20:53.830 に答える
2

ドキュメントには、get_or_create がタプル (オブジェクト、作成済み) を返すことが明確に記載されています。これは、まさにあなたが見ているエラーです。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

于 2012-09-03T21:18:42.927 に答える