2013-03-08 6 views
10

UPDATEДжанго ошибка <model> объект не имеет атрибута «обновления»

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

Я думаю, что это ошибка на mod_wsgi.

В любом случае, спасибо!

Я действительно новичок в django (начался вчера). Мне удалось сделать синтаксический анализатор excel с помощью xlrd, все отлично работает с данными (он действительно загружается очень быстро), мне нужно обновить информацию о файле в базе данных, чтобы я мог знать, как происходит загрузка, вот где у меня есть проблема, метод save() не работает, я уже использовал обновление вместе с get и filter, но всегда ту же проблему.

Я надеюсь, что вы можете указать мне, где это ошибка

models.py

class archivo(models.Model): 
    archivo_id = models.AutoField(primary_key=True) 
    fk_cliente = models.IntegerField() 
    fk_usuario = models.IntegerField() 
    archivo_nombre = models.CharField(max_length = 30) 
    archivo_original = models.CharField(max_length = 255) 
    archivo_extension = models.CharField(max_length = 5) 
    archivo_tamano = models.FloatField() 
    archivo_registros = models.IntegerField() 
    archivo_registros_buenos = models.IntegerField() 
    archivo_registros_malos = models.IntegerField() 
    archivo_registros_cargados = models.IntegerField() 
    archivo_fecha_carga = models.DateTimeField() 
    archivo_fecha_envio = models.DateTimeField() 
    def __unicode__(self): 
     return self.archivo_id 

views.py

from procesa.models import * 
from django.conf import settings 
from django.shortcuts import render_to_response 
import xlrd 
from time import strftime 
from symbol import except_clause 
def procesa(request, procesar = 0): 
    datos = None 
    infoarchivo = None 
    if(procesar > 0): 
     try: 
      infoarchivo = archivo.objects.get(archivo_id=int(procesar)) 
     except: 
      return render_to_response('error.html') 

    if (infoarchivo is not None): 
     excel_path = settings.FILES_URL+infoarchivo.archivo_original 
     wb = xlrd.open_workbook(str(excel_path)) 
     sh = wb.sheet_by_index(0) 
     ##START UPDATE## 
     infoarchivo2 = archivo.objects.filter(archivo_id = procesar) 
     infoarchivo2.archivo_registros = sh.nrows 
     infoarchivo2.save() 
     ##END UPDATE##    
     for rownum in range(sh.nrows): 
      destino = str(sh.cell(rownum,0).value) 
      destino = destino.replace(".0","") 
      if (int(destino) > 0): 
       mensaje = str(sh.cell(rownum,1).value) 
       ahora = strftime("%Y-%m-%d %H:%M:%S") 
       reg = registro.objects.filter(registro_destino__exact=destino,fk_archivo__exact=procesar) 
       #reg = registro.objects.raw(str(el_query)) 

       if (reg.exists()): 
        exists = True 
       else: 
        r = registro(fk_cliente=1,fk_usuario=1,fk_archivo=int(procesar),registro_destino=destino,registro_mensaje=mensaje,registro_estado='Cargado',registro_fecha_carga=ahora) 
        r.save() 


     datos = {'ID':procesar,'PATH': settings.FILES_URL, 'INFO':infoarchivo, 'el_excel':infoarchivo.archivo_original, 'registros':sh.nrows } 
     return render_to_response('carga.html', {'datos': datos}) 

в ## START UPDATE # # блок, который я уже пробовал с

infoarchivo.archivo_registros = sh.nrows 
infoarchivo.save() 

и

archivo.objects.filter(archivo_id = procesar).update(archivo_registros=sh.nrows) 

и

archivo.objects.get(archivo_id = procesar).update(archivo_registros=sh.nrows) 

Я не могу найти ссылку на эту ошибку или что-то еще добавить в файл модели, я уверен, что это что-то очень легко исправлять, но я просто не могу его найти.

Ошибки я получаю (для всех различных кодов) является Типом

Исключения: AttributeError в/procesa/4

Исключения Значения: 'Archivo' объект не имеет атрибута «обновления '

Записи файла анализируются и вставлены без проблем.

Я использую Django 1.5 с Python 2.7 в Apache 2.2 с mod_wsgi и тузд бэкэндом установлен в EC2 на Amazon

UPDATE я делал некоторое обслуживание на сервере и перезагрузил ... когда он пришел назад код работал просто отлично ..., что на самом деле заставляет меня волноваться точно так же ...

Я думаю, что это ошибка на mod_wsgi.

В любом случае, спасибо!

+0

ваше переопределение обновление, которое вы не определить в вашей модели. Перепишите код, который вы используете методом обновления, или определите метод обновления в своей модели, чтобы вы могли его использовать. – catherine

ответ

1

я не прошел через весь код, но эта строка:

infoarchivo2 = archivo.objects.filter(archivo_id = procesar) 

не возвращает экземпляр или объект из базы данных, он возвращает QuerySet, даже когда QuerySet только имеет один элемент. Вам придется перебирать Queryset, возможно, изменить фильтр метода для get.

До тех пор, пока обновление метода, я не думаю, что оно реализовано.

2

Я был подобный случай, но он работал при использовании конструкции, как:

this_spot = Spot.objects.filter(pk=obj.spot.pk) 
this_spot.update(friendly_rate=rating_to_be_persisted) 

, но не работает в случае, когда я хотел доступ непосредственно один экземпляр, например от внешнего ключа на стороне класса. Возврат 'Spot' object has no attribute 'update'.

Причина просто способ update() работы описаны в django documentation:

Путь вокруг подход, как показано на сайте Джанго:

>>> b = Blog.objects.get(pk=1) 

# Update all the headlines belonging to this Blog. 
>>> Entry.objects.select_related().filter(blog=b).update(headline='Everything is the same') 
2

Встречается это поведение и использовал «фильтр», а затем обновить работает, как ожидалось. Например:

Students.objects.select_for_update().filter(id=3).update(score = 10) 

Просто FYI: Если вы не обработки транзакций, изменяя каждое поле отдельно, используя save() может создать несогласованность данных в многопоточной среде. К тому времени, когда threadA вызывает save() на модели, другой threadB мог бы изменить поля модели и сохранить. В этом случае threadA должен прочитать обновленную модель и изменить ее.

Это было Django 1.6.2

2

Вы также можете использовать update_fields для этого:

archivo = archivo.objects.get(archivo_id = procesar) 
archivo.archivo_registros = sh.nrows 
archivo.save(update_fields=['archivo_registros']) 
+0

Это очень хороший ответ, самое главное, что это очень ясно –

Смежные вопросы