2013-03-08 12 views
10

CẬP NHẬTDjango lỗi <model> đối tượng không có thuộc tính 'cập nhật'

tôi đang làm một số bảo trì trên máy chủ và khởi động lại ... một khi nó trở lại mã chỉ làm việc tốt ... mà thực sự làm cho tôi chỉ cần lo lắng ...

tôi nghĩ đó là lỗi trên mod_wsgi.

Cảm ơn bạn!

Tôi thực sự mới với django (bắt đầu hôm qua). Tôi quản lý để làm cho một phân tích excel sử dụng xlrd, mọi thứ hoạt động tốt với dữ liệu (nó tải thực sự thực sự nhanh), tôi cần cập nhật thông tin tập tin trong cơ sở dữ liệu để tôi có thể biết được tải như thế nào, đây là nơi tôi có vấn đề, phương thức save() không hoạt động, tôi đã sử dụng cập nhật cùng với get và filter, nhưng luôn luôn có cùng một vấn đề.

Tôi hy vọng bạn có thể trỏ tôi ra đâu là sai lầm

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

trong ## BẮT ĐẦU CẬP NHẬT # # block tôi đã thử với

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) 

tôi không thể tìm thấy bất kỳ tài liệu tham khảo để lỗi này hay cái gì khác để thêm vào các mô hình tập tin, tôi khá chắc chắn đó là một cái gì đó thực sự dễ dàng để khắc phục, nhưng tôi không thể tìm thấy nó.

Các lỗi tôi nhận được (đối với tất cả các mã khác nhau) là Loại

Ngoại lệ: AttributeError tại/procesa/4

ngoại lệ giá trị gia tăng: đối tượng 'Archivo' không có thuộc tính 'cập nhật '

Bản ghi của tệp được phân tích cú pháp và chèn vào không có vấn đề gì.

Tôi đang sử dụng Django 1,5 với python 2,7 trong Apache 2.2 với mod_wsgi và mysql backend được cài đặt trong EC2 trên Amazon

CẬP NHẬT tôi đang làm một số bảo trì trên máy chủ và khởi động lại ... khi nó đến trở lại mã làm việc tốt ... mà thực sự làm cho tôi phải lo lắng giống nhau ...

tôi nghĩ rằng đó là một lỗi trên mod_wsgi.

Cảm ơn bạn!

+0

trọng của bạn cập nhật mà bạn không xác định trong mô hình của bạn. Viết lại mã mà bạn sử dụng phương thức cập nhật HOẶC xác định phương thức cập nhật trong mô hình của bạn để bạn có thể sử dụng nó – catherine

Trả lời

1

Tôi không đi qua tất cả các mã của bạn, nhưng dòng này:

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

không trở về một thể hoặc đối tượng từ cơ sở dữ liệu, nó sẽ trả về một QuerySet, ngay cả khi QuerySet chỉ có một phần tử. Bạn sẽ phải lặp lại Queryset oy có lẽ thay đổi bộ lọc phương thức để nhận.

Miễn là cập nhật phương pháp, tôi không nghĩ rằng nó được triển khai.

2

Tôi đã có trường hợp tương tự, nhưng nó làm việc khi sử dụng xây dựng như:

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

nhưng không làm việc trong trường hợp, nơi tôi muốn truy cập trực tiếp trường hợp duy nhất, ví dụ từ lớp phía chính nước ngoài. Trả lại 'Spot' object has no attribute 'update'.

Lý do đơn giản là cách update() công trình được mô tả trong django documentation:

Các con đường xung quanh là cách tiếp cận như được hiển thị trên trang web 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

gặp hành vi này và sử dụng một "bộ lọc", sau đó cập nhật hoạt động như mong đợi. Ví dụ:

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

Just FYI: Trừ khi bạn đang xử lý giao dịch, sửa đổi từng lĩnh vực riêng biệt sử dụng save() có thể tạo dữ liệu không thống nhất trong một môi trường đa luồng. Bởi thời gian threadA gọi save() trên mô hình, một threadB khác có thể đã thay đổi các trường mô hình và được lưu. Trong trường hợp đó threadA phải đọc mô hình cập nhật và thay đổi.

Đây là trên Django 1.6.2

2

Bạn cũng có thể sử dụng update_fields cho việc này:

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

Câu trả lời rất hay, điều quan trọng nhất là nó rất rõ ràng –