셀러리 작업 중에 모델에 변경 사항을 저장하려고 할 때 일부 동작이 발생했지만 변경 사항이 커밋되지 않습니다. 파일 업로드가 완료되면 csv를 처리하고 프로세스 결과를 데이터베이스에 저장하기 위해 셀러리 작업이 실행됩니다. 프로세스 상태, 시간은 레코드 수를 처리, 가공 등장고 셀러리 작업이 csv를 처리하는 중 - 모델 저장 안 함
models.py, 나는 다음과 같은 방법이 있습니다 _mark_processed 또는라고 _mark_failed 때
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
는, 변경 사항이 데이터베이스시에 저장되지 않습니다 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()
을 입력하면 변경 사항이 데이터베이스에 반영됩니다.
셀러리 작업을 어떻게 시작합니까? Django 뷰에서 트리거되는 경우, 초기 모델 저장/생성은 트랜잭션에서 유지 될 수 있으며 태스크가 실행될 때 샐러리에 표시되지 않습니다. –
예,보기를 통해 트리거됩니다. 그러면 어떻게해야합니까? 감사. – mrkre