Лучшая практика создания записи модели в сигнале post_save при сохранении целостности данных в DjangoPython

Программы на Python
Ответить
Anonymous
 Лучшая практика создания записи модели в сигнале post_save при сохранении целостности данных в Django

Сообщение Anonymous »

Я работаю над приложением Django, где мне нужно автоматически создавать запись настройки со значениями по умолчанию при каждом создании нового пользователя. Моя текущая реализация использует сигнал post_save модели User для обработки этой логики.

Код: Выделить всё

from django.db.models.signals import post_save
from django.db import transaction
from django.contrib.auth.models import User
from myapp.models import Setting

@receiver(post_save, sender=User)
def create_default_setting(sender, instance, created, **kwargs):
if created:
transaction.on_commit(lambda: Setting.objects.create(user=instance))
Я использовал транзакции.on_commit, чтобы гарантировать, что создание записи настройки происходит только после фиксации транзакции создания пользователя , чтобы избежать проблем, когда экземпляр User может еще не существовать в базе данных. Однако это отделяет создание Settings от транзакции создания User. Если по какой-либо причине создать настройку не удастся (например, ошибки проверки, проблемы с базой данных), я получу запись пользователя без соответствующей настройки, что нарушает целостность данных.
С другой стороны, если я не используютранзакцию.on_commit и создаю настройку непосредственно в сигнале post_save, существует риск попытки чтобы создать запись настройки перед пользователем экземпляр полностью сохраняется в базе данных или создается настройка, даже если создание пользователя завершается неудачно из-за незафиксированной или отката транзакции.
Это оставляет меня с двумя несовершенными решениями:
  • Использование транзакции.on_commit: Гарантирует, что пользователь совершит фиксацию до того, как Создание настройки, но существует риск получения неполных данных в случае создания настройки. не удается.
  • Без транзакции.on_commit: Риск создать настройку до того, как пользователь будет полностью сохранен или создание ненужных записей настроек в неудачных транзакциях.
Мои вопросы:
  • < li>Как лучше всего обрабатывать такие сценарии в Django, когда запись одной модели зависит от успешной создание записи другой модели?
  • Есть ли способ обеспечить создание записей «Пользователь» и «Настройка» в рамках одной транзакции, чтобы гарантировать целостность данных, избегая при этом условий гонки или преждевременных запросов?
Любые рекомендации или предложения будут очень полезны оценил. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... e-maintain
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»