2012-09-03 7 views
6

を持っていない私はジャンゴに新しいですし、私はget_or_createモデル関数を使用しようとしていますが、私はエラーを取得しても、私は私のモデルジャンゴ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); 

何が問題なのですか?

答えて

26

get_or_createはちょうどオブジェクトを返しません。

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

次の2行は不要です。上記のget_or_createコールはd.dias=diaSemanaを確実にするので、再度割り当てる必要はありません。おそらくsaveに電話する必要はありません。代わりに、このオフ

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

ドキュメンテーションによれば、get_or_createはtuple(object、created)を返します。これはまさにあなたが見ているエラーです。代わりにあなたが期待されるオブジェクトのこのタプルが割り当てられていますが、属性のエラーが出るので、あなたのケースではd

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.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

1

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

を行う:

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

@Alasdairが言ったように、タプルの最初のものがオブジェクト

あります
関連する問題