セロリ タスク中にモデルに変更を保存しようとすると、いくつかの動作が発生しましたが、変更はコミットされません。ユーザーによるアップロードの記録を保持するモデルがあります。ファイルがアップロードされると、セロリタスクが実行されて csv が処理され、プロセスの結果がデータベースに保存されます (プロセスステータス、処理時間、処理されたレコード数など)。等
models.py には、次のメソッドがあります。
def import_records_data(self):
total_records = 0
with self.filepath.file as csvfile:
reader = csv.reader(csvfile, delimiter=',')
next(reader, None) # skip header
for row in reader:
# process record
total_records += 1
return total_records
def process(self):
self.date_start_processing = datetime.datetime.utcnow().replace(tzinfo=utc)
try:
# process upload data,
records_processed = self.import_records_data()
except Exception, e:
self._mark_failed(unicode(e))
else:
self._mark_processed(num_records=records_processed)
def _mark_processed(self, num_records, description=None):
self.status = self.PROCESSED
self.date_end_processing = datetime.datetime.utcnow().replace(tzinfo=utc)
self.num_records = num_records
self.processing_description = description
self.save()
def _mark_failed(self, description):
self.status = self.FAILED
self.processing_description = description
self.save()
def was_processing_successful(self):
return self.status == self.PROCESSED
_mark_processed または _mark_failed が呼び出された場合、self.save()
が呼び出されたときに変更はデータベースに保存されません。このメソッドは、tasks.py から呼び出されます。
@task(name='csv-process-upload')
def process_upload(upload_id):
upload = Upload.objects.get(id=upload_id)
upload.process()
if upload.was_processing_successful():
message_user(
upload.user,
"Your upload '%s' was processed successfully, %s records processed" % (
upload.filename,
upload.num_records))
else:
message_user(
upload.user,
"Your upload '%s' could not be processed, error message: %s" % (
upload.filename,
upload.processing_description,))
モデルの保存を妨げている原因は何ですか? _mark_processed
シェルでデバッグして と入力self.save()
すると、変更がデータベースに反映されます。