2016-09-29 4 views
0

Djangoでsave()関数を書くべきですか?モデルクラスではmodels.py、フォームではforms.pyですか?例えばDjangoでsave関数を書く場所は?

: models.py

class Customer(models.Model): 
    name = models.CharField(max_length=200) 
    created_by = models.ForeignKey(User) 

    def save(): 
     ........ some code to override it....... 

forms.py

class Addcustomer(forms.ModelForm): 
    class Meta: 
     model = Customer 
     fields = ('name',) 
    def save(): 
    ........code to override it.... 

私は私の保存機能を無効にする必要がありますか?

+0

のデフォルト実現は誰もが私の中のユースケースを与える、私はmodel.pyまたはform.pyに保存上書きするものとする場合には、応じことができますしてくださいです@Sardorbek Imomalievに、私はuse.pyとform.pyでのライドオーバーの利点を知るようになりました! – dilwaria

+0

@Moderatorなぜこの問題が下降したのですか – dilwaria

答えて

0

本当にあなたが達成しようとしているものによって決まります。 ModelFormのデフォルトの実現は、Modelのセーブコールを保存します。しかし、通常は検証を実行するので、formでそれを上書きする方が良いです。すでにフォームを使用している場合は、ModelForm.saveを上書きすることをお勧めします。そして、私はここでsuper

を使用して拡張意味オーバーライドすることでModelForm.save

def save(self, commit=True): 
    """ 
    Save this form's self.instance object if commit=True. Otherwise, add 
    a save_m2m() method to the form which can be called after the instance 
    is saved manually at a later time. Return the model instance. 
    """ 
    if self.errors: # there validation is done 
     raise ValueError(
      "The %s could not be %s because the data didn't validate." % (
       self.instance._meta.object_name, 
       'created' if self.instance._state.adding else 'changed', 
      ) 
     ) 
    if commit: 
     # If committing, save the instance and the m2m data immediately. 
     self.instance.save() 
     self._save_m2m() 
    else: 
     # If not committing, add a method to the form to allow deferred 
     # saving of m2m data. 
     self.save_m2m = self._save_m2m 
    return self.instance 

save.alters_data = True 
+0

まず検証の観点からおかげさまで、ありがとうございます。しかし、私はmodel.py – dilwaria

+0

@dilwariaのsave関数をオーバーライドする単一のユースケースを与えることができます。モデルの保存をオーバーライドする必要はほとんどありません。それは触れるべきでない/変わる多くのことをするからです。通常、モデルの保存にステップを追加する場合は、[django signals](https://docs.djangoproject.com/ja/1.10/topics/signals/)を使用できます。私の経験では、人々は信号について知りませんし、彼らが何をしているのか正確に知っていないため、モデルの保存をオーバーライドします。 –

+0

@Sardorbrekは洞察力とベストプラクティスのことに感謝します!私もdjangoのシグナルを通過します! – dilwaria

関連する問題