Использование Django-RQ (v2.3.0)
запроса к базе данных (PostgreSQL)
работает, только если сделано дважды. Это настройка:
models.py
:
class AnalysisResult(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
public_id = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
tasks.py
:
@job(os.getenv("REDIS_QUEUE_NAME", "default"))
def update_progress_in_db(result_id: UUID):
# FIXME This query only works on the second try when we run this here inside the rqworker?!
try:
tmp_record = AnalysisResult.objects.get(public_id=result_id)
except (AnalysisResult.DoesNotExist, AnalysisResult.MultipleObjectsReturned) as e:
# Always getting the exception here!
logger.error("Error retrieving tmp_record with id={}: {}.".format(result_id, e))
except Exception as ex:
logger.error("General error while retrieving tmp_record: {}".format(ex))
try:
record = AnalysisResult.objects.get(public_id=result_id)
logger.debug("result record: {}".format(record)) # Working fine.
except (AnalysisResult.DoesNotExist, AnalysisResult.MultipleObjectsReturned) as e:
# Never getting this exception.
logger.error("Error updating progress status with id={}: {}.".format(result_id, e))
except Exception as ex:
logger.error("General error while updating progress status: {}".format(ex))
Запуск AnalysisResult.objects.get(public_id=result_id)
в django-admin shell
всегда отлично работает на первая попытка. И мне бы очень хотелось не использовать описанный выше обходной путь, пытаясь дважды запросить запись. Он просто кажется слишком грязным.
Указатели на то, что здесь может отсутствовать, приветствуются.