2015-10-19 3 views
0

Изучение способов использования Django. Я пытаюсь этот код:Django - обновить или вставить по запросу

if form.is_valid() and form.has_changed(): 
    try: 
     p = profile.objects.get(user_id= user.id) 
     #Append data to profile record 
        profile_record.save() 
    except p.DoesNotExist as e: 
     #Create new profile record 
     profile_record.save() 

user_id Когда (поле FK) не найден Я получаю сообщение об ошибке:

local variable 'p' referenced before assignment

я предполагал, что p = ... это назначение?

Благодарим вас за любые указания относительно того, что я делаю неправильно здесь.

+0

Что такое 'p' и что такое' profile_record'? – Wtower

ответ

0

Try фильтровать запрос .. .get всегда должен использоваться в случае, если вы знаете, что будет только один объект при запросе.

if form.is_valid() and form.has_changed(): 
     p = profile.objects.filter(user_id = user.id) 
     if p: 
      p = p[0] 
      #Append data to profile record 
      profile_record.save() 
     else: 
      #Create new profile record 
      profile_record.save() 

.get (поле = что-то) всегда будет бросать ошибку, если нет результата или более 1 результат, в то время как .filter() не выбрасывает ошибку в этих случаях.

+0

Спасибо - также нашел это полезным – Chas

3

Ваша ошибка возникает из-за того, что p сначала задается во время раздела try. Кроме того, вы ссылаетесь на p, но p не был назначен ни на что в этой точке, потому что если исключение достигнуто, тогда раздел try «отменен», и именно здесь p назначается.

Попробуйте изменить except p.DoesNotExist as e: к except Person.DoesNotExist:

+0

Спасибо Забари - ваш ответ позволил мне понять мою ошибку. – Chas

0

Почему не используется

if form.is_valid() and form.has_changed(): 
    form.save() 
Смежные вопросы