Я бы выбрал вариант А, и я настоятельно рекомендую переименовать модель «Запрос» в нечто иное, например: «SearchRequest» Request
является чем-то очень специфичным в мире django и если вы добавите в него новый контекст, вы скоро очень запутаетесь.
Когда срабатывает SearchRequest
, вы можете сохранить время создания, статус в STARTED
и затем выполнить исследование. Что-то может пойти не так во время исследования, поэтому лучше, если вы включите поиск изображений в попытке / за исключением. Затем вы можете сохранить статус с помощью FAILED
и указать причину, если что-то пойдет не так. Это ответ на вопрос об атомарной транзакции, вам не нужно .
Еще одно предложение, переместите имя изображения в модель изображения, SearchRequest может получить имя изображения из связанных изображений.
Улучшение в SearchRequest состояло бы в том, чтобы сохранить статус как связанную модель, чтобы вы могли восстановить изменение статуса во время поиска.
class SearchRequestStatus(models.Model):
create_time = models.DateTimeField('create time', auto_now_add=True)
status = models.CharField(max_length=48)
detail = models.CharField(max_length=256)
search = models.ForeignKey(SearchRequest, on_delete=models.CASCADE, related_name='statuses')
Это решение может быть достигнуто двумя способами:
Вы сохраняете явное изменение статуса в соответствующем поле
создание вручную нового SearchRequestStatus или ..
Вы сохраняете status
и status_detail
в SearchRequest
и
сигнал сохранения захватит изменения и автоматически создаст
SearchRequestStatus
с использованием приемника. (увидеть:
https://docs.djangoproject.com/en/2.1/topics/signals/)
@ получатель (сигналов.post_save, отправитель = SearchRequest, слабый = False, dispatch_uid = "_ update_search_request_status_history")
def _update_search_request_status_history (отправитель, экземпляр, ** kwargs):
current_status = SearchRequest.objects.filter (search = instance) .first ()
если не current_status или current_status.status! = instance.status:
SearchRequestStatus.objects.create (поиск = экземпляр,
status = instance.status, status_detail = instance.status_detail)
Конечно, вы должны добавить поля к вашей SearchRequest
модели, а также добавить кортеж STATUSES, чтобы ограничить выбор статусов
status = models.CharField(max_length=15, choices=STATUSES.items(), default=`STARTED`)
status_detail = models.CharField(max_length=80, null=True, blank=True)