2016-08-09 3 views
0

У меня есть ModelForm, где я хочу переопределить метод save() для создания связанных объектов. Мне нужно, что в transaction.atomic()Правильно ли применять транзакционную атомную внутреннюю форму?

это правильно применить его так:

class MyForm(ModelForm): 
    @transaction.atomic 
    def save(self, commit): 
     self.instance.save() 
     # and create related objects using self.instance.. 

Потому что я всегда видел, что она применяется на взгляд, но на мой взгляд класс на основе, так что я не могу примените этот декоратор. и мне также кажется логичным применить его в реальном методе, который сохраняет значения. Во-вторых, что такое «глубина» атомарной транзакции, если я применяю ее для просмотра, я предполагаю, что она применима к любому вызову оттуда?

+0

Вы можете использовать этот декоратор с любой функцией, однако, вы можете достичь этого внутри вида, это не имеет значения, если оно классифицируется на основе или нет. Вы также можете создавать связанные объекты внутри представления, поэтому вам не нужно изменять modelForm. Как выглядит ваше мнение, почему вы не можете использовать его там? (Я добавил пример ниже, для классифицированных представлений) –

+0

Мое представление является общим, поэтому я решил, что должен использовать метод_декоратор. Я думаю, что более логично делать сохранение работы в форме, а не в представлении? – user3599803

+0

, если вы хотите использовать декоратор и имеете возможность обрабатывать ошибки целостности, а затем подумайте об использовании обоих. Вы можете сделать это внутри формы, это зависит от вас. Если вам требуется передать новые аргументы для создания init, тогда лучше сделать это внутри представления. –

ответ

0

Согласно моему комментарию, я добавляю пример того, как это сделать в представлении на основе класса.

Вы можете использовать декоратор, как это:

class YourView(View): 
    @transaction.atomic 
    def post(self, request, *args, **kwargs): 
     ... 

Или лучше вы можете сделать это:

class YourView(View): 
    def post(self, request, *args, **kwargs): 
     try: 
      with transaction.atomic(): 
       your_model = form.save() 
       generate_relationships() 
     except IntegrityError: 
      handle_exception() 

Или вы можете использовать оба.

Ссылка: django transactions docs

Смежные вопросы