2013-03-08 10 views
10

UPDATEDjango błąd <model> obiekt ma atrybut „update”

robię pewne utrzymanie na serwerze i uruchomiony ponownie ... raz wrócił kod pracował dobrze ... co rzeczywiście sprawia mi martwić się tak samo ...

Myślę, że to błąd na mod_wsgi.

Dzięki!

Jestem naprawdę nowy dla django (rozpoczęty wczoraj). Udało mi się zrobić parser excel za pomocą xlrd, wszystko działa dobrze z danymi (ładuje się naprawdę bardzo szybko), muszę zaktualizować informacje o pliku w bazie danych, więc mogę wiedzieć, jak działa obciążenie, to jest, gdzie mam problem, metoda save() nie działa, ja już użyłem aktualizacji wraz z get i filtrem, ale zawsze ten sam problem.

Mam nadzieję, że można wskazać mi gdzie jest błąd

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}) 

w ## START UPDATE # # blok już próbowałem z

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

i

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

i

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

nie mogę znaleźć żadnego odniesienia do tego błędu lub coś innego, aby dodać do pliku modeli, jestem całkiem pewien, że to coś naprawdę proste naprawić, ale po prostu nie mogę go znaleźć.

Błąd Dostaję (dla wszystkich różnych kodów) jest

Wyjątek Typ: AttributeError w/procesa/4

Wyjątek Wartość: 'Archiwum' obiekt ma atrybut „aktualizacji '

Zapisy pliku są przetwarzane i wstawiane bez problemu.

Używam Django 1.5 z Pythona 2.7 w Apache 2.2 z zainstalowanym w EC2 na Amazon mod_wsgi i mysql backend

UPDATE robię pewne utrzymanie na serwerze i uruchomiony ponownie ... raz przyszło z powrotem kod działał dobrze ... co właściwie sprawia, że ​​martwię się tak samo ...

Myślę, że to błąd na mod_wsgi.

Dzięki!

+0

swoje nadrzędne aktualizację którego nie zdefiniował w swoim modelu. Przepisz kod, który używasz metody aktualizacji LUB zdefiniuj metodę aktualizacji w swoim modelu, abyś mógł z niej korzystać – catherine

Odpowiedz

1

nie przeszedł całego kodu, ale ta linia:

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

nie zwraca instancję lub obiekt z bazy danych, zwraca QuerySet, nawet gdy QuerySet ma tylko jeden element. Będziesz musiał powtórzyć kwerendę oy może zmienić filtr metody get.

Tak długo, jak aktualizacja metody, nie sądzę, że jest zaimplementowana.

2

miałem podobny przypadek, ale to działało przy użyciu konstrukcji jak:

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

ale nie działa w przypadku, gdzie chciałam dostęp bezpośrednio pojedynczy przypadek, na przykład z klucza obcego klasy bocznym. Wracając 'Spot' object has no attribute 'update'.

Powodem jest po prostu sposobem update() prace opisane w django documentation:

Droga wokół jest podejście jak pokazano na stronie django:

>>> 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

napotkał ten problem i używane „filtr”, a następnie aktualizować działa zgodnie z oczekiwaniami. Na przykład:

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

Wystarczy FYI: Jeśli nie jesteś obsłudze transakcji, modyfikowanie każdego pola oddzielnie używając save() może tworzyć niezgodność danych w środowisku wielowątkowym. Do czasu, gdy wątekA wywoła save() w modelu, inny wątekB mógł zmienić pola modelu i zapisać. W takim przypadku threadA musi przeczytać zaktualizowany model i zmienić.

To było na Django 1.6.2

2

Można również użyć do tego update_fields:

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

To bardzo dobra odpowiedź, najważniejszą rzeczą jest to, że jest bardzo przejrzysta –

Powiązane problemy