2016-10-05 1 views
1

私はスラッグを生成するためのカスタムフィールドを持っていて、これを私のモデルで使用しています。モデルインスタンスがカスタムフィールドのpre_saveから渡されたデータを反映していない

私が理解できない奇妙なことは、このカスタムフィールドのメソッドpre_saveが現在のインスタンスに設定されていないために発生している理由です。

私の質問は、スラッグを別の方法で生成することではなく、この動作についてです。

は、この例を簡素化するために、私はこのクラスを定義した:

モデル:

class MyModel(models.Model): 
    slug = MyCustomField(blank=True) 

    def save(self, *args, **kwargs): 
     super(MyModel, self).save(*args, **kwargs) 
     print 'in save' 
     print self.slug 

フィールド:

@receiver(post_save, sender=MyModel) 
def test(sender, **kwargs): 
    print 'in signal' 
    print kwargs['instance'].slug 
    print 'from database' 
    print MyModel.objects.get(pk=kwargs['instance'].pk).slug 

コード:

class MyCustomField(models.SlugField): 
    def pre_save(self, model_instance, add): 
     value = super(MyCustomField, self).pre_save(model_instance, add) 
     if not value: 
      value = 'random-generated-slug' 
     return value 

ポストが信号を保存

実行する:

instance = MyModel() 
instance.save() 
>> 'in signal' 
>> '' 
>> 'in database' 
>> 'random-generated-slug' 
>> 'in save' 
>> '' 
instance.slug 
>> '' 

をあなたが見ることができるように、値がデータベースに設定されたが、それは現在のインスタンスにもpost_save信号ではありませんされています。

私はDjangoバージョン1.10を使用しています。 MyCustomFieldに別の方法で値を設定する必要がありますか?何が起こっている?

編集: フィールドのsave_form_dataにこの値を設定する必要がありますか、これを行うには最適な場所はどこですか?

答えて

1

インスタンスのスラッグフィールドは、保存の呼び出しとデータベースへの書き込みの間で更新されました。現在のインスタンスのスラッグの値がDBに書き込まれたスラグ値を取得するには古い

で、インスタンスがに、データベースからを再フェッチによって更新しました:答えを

instance = MyModel.objects.get(pk=your_pk) 
+0

感謝。それは理にかなっている。 'MyCustomField'のインスタンスを更新したい場合は、' save_form_data'が良い場所になると思いますか? – davekr

+0

あなたが求めていることは分かりませんが、DBに書き込まれる前ではなく、インプレース*でインスタンスを更新することはできないと思います。 –

関連する問題