2017-10-03 21 views
1

Djangoモデルフィールドのdefaultを同じインスタンスの別のフィールドの値に基づいて定義するにはどうすればよいですか?別のフィールドの値に基づくフィールドのデフォルト値

私はcreatedタイムスタンプに基づいてモデルのcodeを定義したい:

from django.db import models 

class LoremIpsum(models.Model): 
    code = models.CharField(
     max_length=100, 
     default=(
      lambda x: "LOREM-{0.created:%Y%m%d-%H%M%S}".format(x)), 
    ) 
    created = models.DateTimeField(
     auto_now_add=True, 
    ) 

defaultのために定義された関数は、引数を受けないため、動作しません。

codeフィールドのデフォルト値を、そのインスタンスのcreatedフィールド値から派生するように定義するにはどうすればよいですか?

+0

私の助言は、最初にオブジェクトを作成した後に値を設定することです。存在しないものに基づいてデフォルト値を設定することはできません。作成後にそれを行うと、 'created'フィールドを利用することができます – jape

答えて

1

Django signalsを使用すると、モデルからthe post_init signalを受け取ることによってこれを行うことができます。それはインスタンスに初期化を行った後

from django.db import models 
import django.dispatch 

class LoremIpsum(models.Model): 
    code = models.CharField(
     max_length=100, 
    ) 
    created = models.DateTimeField(
     auto_now_add=True, 
    ) 

@django.dispatch.receiver(models.signals.post_init, sender=LoremIpsum) 
def set_default_loremipsum_code(sender, instance, *args, **kwargs): 
    """ 
    Set the default value for `code` on the `instance`. 

    :param sender: The `LoremIpsum` class that sent the signal. 
    :param instance: The `LoremIpsum` instance that is being 
     initialised. 
    :return: None. 
    """ 
    if not instance.code: 
     instance.code = "LOREM-{0.created:%Y%m%d-%H%M%S}".format(instance) 

post_init信号は、クラスによって送信されます。このようにして、このインスタンスは、ヌル入力可能フィールドが設定されているかどうかをテストする前に、codeの値を取得します。

関連する問題