私はスラッグを生成するためのカスタムフィールドを持っていて、これを私のモデルで使用しています。モデルインスタンスがカスタムフィールドの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
にこの値を設定する必要がありますか、これを行うには最適な場所はどこですか?
感謝。それは理にかなっている。 'MyCustomField'のインスタンスを更新したい場合は、' save_form_data'が良い場所になると思いますか? – davekr
あなたが求めていることは分かりませんが、DBに書き込まれる前ではなく、インプレース*でインスタンスを更新することはできないと思います。 –