32

アップデート

私はサーバーでいくつかのメンテナンスを行っていて、再起動しました...戻ってくると、コードは問題なく機能しました...実際には同じことを心配しています...

mod_wsgi のバグだと思います。

とにかくありがとう!

私は本当にdjangoが初めてです(昨日始めました)。私は xlrd を使用して Excel パーサーを作成することができました。すべてがデータで正常に動作します (ロードは非常に高速です)。データベース内のファイル情報を更新する必要があるため、ロードの進行状況を知ることができます。問題、save() メソッドが機能しません。既に update と 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

ビュー.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)

このエラーまたはモデル ファイルに追加する他の何かへの参照が見つかりません。修正するのは本当に簡単だと確信していますが、見つけることができません。

私が得ているエラー(すべての異なるコードに対して)は

例外の種類: /procesa/4 の AttributeError

例外値: 'archivo' オブジェクトには属性 'update' がありません

ファイルのレコードは解析され、問題なく挿入されます。

AmazonのEC2にmod_wsgiとmysqlバックエンドがインストールされたApache 2.2でpython 2.7でDjango 1.5を使用しています

更新 サーバーでいくつかのメンテナンスを行って再起動しました...戻ってくると、コードは問題なく動作しました...実際には同じことを心配しています...

mod_wsgi のバグだと思います。

とにかくありがとう!

4

4 に答える 4

58

このエラーの理由は.get()、 が個々のオブジェクトを返し、 の代わりに で.update()返されるものなど、クエリセットでのみ機能することです。.filter().get()

を使用している場合は.get()、機能し.update()ません。オブジェクトに情報を手動で保存する必要があります。

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

この特定のデータのみを保存したい場合は、update_fieldsを使用することもできます。

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

これにより、呼び出したくないシグナルがトリガーされるのを防ぐことができます。

あなたの他のオプションは、単に使用すること.filter()です。

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

複数のオブジェクトが存在する場合、これが更新されることに注意してください。そうならないようにする場合は、フィルターに主キーを含めるか、以前のアプローチのいずれかを使用して、単一のオブジェクトのみを変更していることを確認する必要があります。

于 2016-10-08T15:39:32.460 に答える
9

この動作に遭遇し、「フィルター」を使用すると、更新が期待どおりに機能します。例えば:

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

参考までに: トランザクションを処理している場合を除き、 を使用して各フィールドを個別に変更するsave()と、マルチスレッド環境でデータの不整合が生じる可能性があります。threadA がモデルを呼び出すまでsave()に、別の threadB がモデル フィールドを変更して保存している可能性があります。その場合、threadA は更新されたモデルを読み取って変更する必要があります。

これはDjango 1.6.2でした

于 2015-04-06T09:40:24.327 に答える
3

同様のケースがありましたが、次のような構造を使用すると機能しました。

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

しかし、外部キーサイドクラスなどから単一のインスタンスに直接アクセスしたい場合には機能しません。戻る'Spot' object has no attribute 'update'

その理由は、単にdjangoのドキュメントupdate()に記載されている方法です:

回避策は、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')
于 2014-03-30T10:19:16.083 に答える
0

すべてのコードを調べたわけではありませんが、次の行:

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

データベースからインスタンスまたはオブジェクトを返すのではなく、Queryset に要素が 1 つしかない場合でも、Queryset を返します。Queryset を繰り返す必要があり、おそらく get のメソッド フィルターを変更する必要があります。

メソッドが更新されている限り、実装されていないと思います。

于 2013-03-08T22:45:04.357 に答える