Код: Выделить всё
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 и создаю настройку непосредственно в сигнале post_save, существует риск попытки чтобы создать запись настройки перед пользователем экземпляр полностью сохраняется в базе данных или создается настройка, даже если создание пользователя завершается неудачно из-за незафиксированной или отката транзакции.
Это оставляет меня с двумя несовершенными решениями:
- Использование транзакции.on_commit: Гарантирует, что пользователь совершит фиксацию до того, как Создание настройки, но существует риск получения неполных данных в случае создания настройки. не удается.
- Без транзакции.on_commit: Риск создать настройку до того, как пользователь будет полностью сохранен или создание ненужных записей настроек в неудачных транзакциях.
- < li>Как лучше всего обрабатывать такие сценарии в Django, когда запись одной модели зависит от успешной создание записи другой модели?
- Есть ли способ обеспечить создание записей «Пользователь» и «Настройка» в рамках одной транзакции, чтобы гарантировать целостность данных, избегая при этом условий гонки или преждевременных запросов?
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-maintain
Мобильная версия