Дублированные модели с администратором Django

#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 функции.