#python #django #python-3.x #transactions #django-admin
#python #django #python-3.x #транзакции #django-admin
Вопрос:
Для конкретной модели я использую интерфейс администратора Django. Я реализовал пользовательскую проверку (чистые методы) и метод сохранения.
Итак, у меня есть что-то вроде этого:
class DailyActivitiesAdmin(admin.ModelAdmin):
form= MyCustomFormForm
def save_model(self, request, obj, form, change):
.... my custom save ....
class MyCustomFormForm(forms.ModelForm):
....
def clean(self):
... my custom validation ...
def clean_my_field(self):
... my custom field validation ...
Мой вопрос:
Должен ли я явно управлять транзакцией от проверки до сохранения модели или атомарность уже управляется в Django admin?
Мой клиент сообщил мне об ошибке по этому поводу:
В моей чистой проверке я внедрил проверку, чтобы избежать похожих моделей; Когда-нибудь он может создать дублированную модель. Я думаю, что, вероятно, он чаще нажимал на кнопку сохранения и, вероятно, у него было медленное подключение к Интернету.
Это возможный сценарий? Могу ли я аннулировать это? Например, могу ли я отключить кнопки сохранения во время запросов на сохранение?
Могу ли я каким-либо образом гарантировать атомарность, если она еще не управляется?
PS: Я использую Python 3, Djnago 2 и Postgres
Ответ №1:
Вы должны явно блокировать строки для обновлений. Используйте transaction.atomic()
и select_for_update()
. Вот пример:
@transaction.atomic
def update_bank_account():
# Another call to update_bank_account will block until the first one is finished
account = BankAccount.objects.select_for_update().get(id=123)
sleep(120)
account.usd = 100
account.save()
Документы:
Ответ №2:
В моей чистой проверке я внедрил проверку, чтобы избежать похожих моделей; Когда-нибудь он может создать дублированную модель.
Это звучит как проблема, с которой я столкнулся. Убедитесь, что save()
не вызывается из вашей clean
функции.