2013-03-08 16 views
10

UPDATEDjango errore <model> oggetto non ha attributo 'update'

stavo facendo un po 'di manutenzione sul server ed ho ripartito ... una volta che è tornato il codice ha funzionato bene ... che in realtà mi fa a preoccupare lo stesso ...

penso che sia un bug su mod_wsgi.

Grazie comunque!

Sono davvero nuovo di django (iniziato ieri). Sono riuscito a fare un parser excel usando xlrd, tutto funziona bene con i dati (si carica davvero molto velocemente), ho bisogno di aggiornare le informazioni sul file nel database in modo da poter sapere come sta andando il carico, questo è dove ho il problema, il metodo save() non funziona, ho già usato l'aggiornamento insieme a get e filter, ma sempre lo stesso problema.

spero che mi può indicare dove è l'errore

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

nel ## AVVIO UPDATE # # blocco che ho già provato con

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

e

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

e

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

non riesco a trovare alcun riferimento a questo errore o qualcosa di altro da aggiungere nel file di modelli, sono abbastanza sicuro che sia qualcosa di veramente facile risolvere, ma non riesco a trovarlo.

l'errore che sto ottenendo (per tutti i diversi codici) è

Tipo eccezione: AttributeError a/procesa/4

Eccezione Valore: oggetto 'archivo' non ha alcun aggiornamento attributo' '

I record del file vengono analizzati e inseriti senza problemi.

sto usando Django 1.5 con python 2.7 in Apache 2.2 con mod_wsgi e MySQL backend installati in EC2 su Amazon

UPDATE stavo facendo un po 'di manutenzione sul server ed ho ripartito ... una volta che è venuto il codice funzionava bene ... il che mi fa preoccupare lo stesso ...

penso che sia un bug su mod_wsgi.

Grazie comunque!

+0

tua ignorando l'aggiornamento che non hai definito nel modello. Riscrivi il codice che usi il metodo di aggiornamento OPPURE definisci il metodo di aggiornamento nel tuo modello in modo che tu possa usarlo – catherine

risposta

1

non ho passato attraverso tutto il codice, ma questa linea:

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

non restituisce un'istanza o un oggetto dal database, si restituisce un Queryset, anche quando il Queryset ha un solo elemento. Dovresti iterare il Queryyset o forse cambiare il filtro del metodo per ottenere.

Finché l'aggiornamento del metodo, non penso che sia implementato.

2

ho avuto caso simile, ma ha funzionato quando si utilizza come costruzione:

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

ma non funziona nel caso in cui volevo accesso direttamente singola istanza, per esempio dalla classe lato chiave esterna. Restituzione 'Spot' object has no attribute 'update'.

La ragione è semplicemente il modo update() lavori descritti in django documentation:

Il modo è di circa approccio come indicato sul sito 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

incontrato questo comportamento e usato un "filtro" quindi aggiornare funziona come previsto. Per esempio:

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

Cordiali saluti: A meno che non si sta gestendo le operazioni, modificando ogni campo separatamente utilizzando save() potrebbe creare incoerenza dei dati in un ambiente multi-threaded. Nel momento in cui threadA chiama save() su un modello, un altro threadB potrebbe aver modificato i campi del modello e salvato. In tal caso, threadA deve leggere il modello aggiornato e modificare.

Questo era in Django 1.6.2

2

È inoltre possibile utilizzare update_fields per questo:

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

È un'ottima risposta, la cosa più importante è che è molto chiaro –

Problemi correlati