2017-07-28 11 views
0

またはこれを行うことはできますか?別のフィールドのデフォルトとしてモデルのIDを使用する

これは必ずしも最終的な結果モデルではありませんが(これはちょっとした論理的なものではありません)、私がしたいと思っているこのモデルを作成する際には、親参照として独自のIDを使用します。

この時点で、IDのAutoFieldは問題ありません。私が何を探しているのかを容易にするためにそれを変更する必要がない限り。

当然のことながら、私は以下の移行「自己」エラーが発生しますが、それは私の例を説明するのに役立ちます:

class Person(models.Model): 
    dtob = models.DateTimeField(blank=False, verbose_name="Date of birth", default=datetime.now) 
    dtod = models.DateTimeField(blank=False, verbose_name="Date of death", default=datetime.now) 
    creationdate = models.DateTimeField(blank=False, verbose_name="Creation date", default=datetime.now) 
    BLOOD_TYPE_CHOICES=(
     ('O+', 'O Positive'), 
     ('O-', 'O Negative'), 
     ('A+', 'A Positive'), 
     ('A-', 'A Negative'), 
     ('B+', 'B Positive'), 
     ('B-', 'B Negative'), 
     ('AB+', 'AB Positive'), 
     ('AB-', 'AB Negative'), 
    ) 
    bloodtype = models.CharField(blank=False, verbose_name="Blood type", max_length=3, choices=BLOOD_TYPE_CHOICES, default='O+') 
    parentA = models.IntegerField(blank=False, verbose_name="Parent A", default=self.id) 
    parentB = models.IntegerFiled(blank=False, verbose_name="Parent B", default=self.id) 

すべての助けとコメント感謝します。

+1

これを行うにはsave()をオーバーライドできます。保存したら、親IDをself.idで更新して、再度保存することができます。 – Sayok88

答えて

1

defaultを使用してこれを行う方法はありません。これらのデフォルトはPythonで計算され、データがデータベースに送られ、idが生成されます。それを行うには

一つの方法は、データベース・トリガーを使用することですが、その時点でインスタンスのidが生成されていますので、あなたは、save()をオーバーライドまたはpost_save信号を処理することにより、ジャンゴで基本的に同じことを行うことができます。後者の例を次に示します。

from django.db.models.signals import post_save 
from django.dispatch import receiver 

@receiver(post_save, sender=Person) 
def populate_parents(sender, instance, created, **kwargs): 
    if created: 
     instance.parentA = instance.id 
     instance.parentB = instance.id 
     instance.save() 
+0

これは多かれ少なかれ私が思ったことですが、それはデフォルトとしてまだ存在しない虚数を使用するように尋ねるのと似ています。私が遭遇した素敵なDjangoのトリッキーで、私はそれが価値があるかもしれないと思った:) save()ポイントでは、私は何か他のことができます。 – Rasta

関連する問題