Django erreur <modèle> objet n'a pas d'attribut "mettre à jour"
Mise à JOUR
J'ai été faire un peu d'entretien sur le serveur et redémarré... une fois qu'il est revenu le code a très bien fonctionné... ce qui fait réellement m'inquiéter tout de même...
je pense que c'est un bug sur mod_wsgi.
Merci quand même!
Je suis vraiment nouveau à django (commencé hier). J'ai réussi à faire un excel à l'aide de l'analyseur xlrd, tout fonctionne bien avec les données (il charge vraiment très vite), j'ai besoin de mettre à jour les informations du fichier dans la base de données pour que je puisse savoir comment la charge est en cours, c'est là où j'ai le problème, la méthode save() ne fonctionne pas, j'ai déjà utilisé la mise à jour avec get et le filtre, mais toujours le même problème.
J'espère que vous pouvez m'indiquer où est l'erreur
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})
dans l' ##DÉMARRER la mise à JOUR## bloc, j'ai déjà essayé avec
infoarchivo.archivo_registros = sh.nrows
infoarchivo.save()
et
archivo.objects.filter(archivo_id = procesar).update(archivo_registros=sh.nrows)
et
archivo.objects.get(archivo_id = procesar).update(archivo_registros=sh.nrows)
Je ne trouve pas de référence à cette erreur ou quelque chose d'autre à ajouter dans les modèles de fichier, je suis sûr que c'est quelque chose de vraiment facile à corriger, mais je ne peux pas le trouver.
L'erreur que je reçois (pour tous les différents codes) est
Type d'Exception: AttributeError /procesa/4
Valeur d'Exception: 'archivo de l'objet n'a pas d'attribut de 'mise à jour'
Les enregistrements du fichier est analysé et inséré sans problème.
Je suis en utilisant Django 1.5 avec python 2.7 de Apache 2.2 avec mod_wsgi et backend mysql installé dans EC2 d'Amazon
Mise à JOUR
J'ai été faire un peu d'entretien sur le serveur et redémarré... une fois qu'il est revenu le code a très bien fonctionné... ce qui fait réellement m'inquiéter tout de même...
je pense que c'est un bug sur mod_wsgi.
Merci quand même!
OriginalL'auteur mariofix | 2013-03-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également utiliser update_fields pour cela:
OriginalL'auteur
Rencontré ce problème et a utilisé un "filtre", puis la mise à jour fonctionne comme prévu. Par exemple:
Juste pour info: si vous n'êtes traitement des transactions, la modification de chaque domaine séparément à l'aide d'
save()
peut créer des incohérences de données dans un environnement multi-thread. Par les temps threadA appelssave()
sur un modèle, une autre threadB pourrait avoir changé le modèle de champs et enregistré. Auquel cas threadA y a qu'à lire la mise à jour du modèle et de changement.C'était sur Django 1.6.2
OriginalL'auteur
J'ai eu le même cas, mais il a travaillé lors de l'utilisation de la construction comme:
mais ne fonctionne pas dans le cas, où je voulais accéder directement à instance unique, l'e.g de clé étrangère côté de la classe. De retour
'Spot' object has no attribute 'update'
.La raison en est simplement la façon dont
update()
travaux décrits dans documentation de django:Autour est comme indiqué sur le site django:
OriginalL'auteur
Je ne suis pas allé à travers tout ton code, mais cette ligne:
ne pas retourner une instance ou d'un objet à partir de la base de données, il renvoie un Queryset, même lorsque le Queryset n'a qu'un seul élément. Vous devez effectuer une itération de la Queryset oy peut-être changer la méthode de filtre pour l'obtenir.
Tant que la méthode de mise à jour, je ne pense pas qu'il est mis en œuvre.
OriginalL'auteur