2017-07-28 96 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()來完成該操作。一旦保存,您可以使用self.id更新父母ID並再次保存。 – Sayok88

回答

1

沒有辦法使用default來做到這一點。在將數據發送到數據庫並生成id之前,這些默認值是用Python計算的。

一種方式做到這一點是使用一個數據庫觸發器,但你可以通過重寫save()或處理post_save信號,因爲在這一點上基本上做同樣的事情在Django實例的id已經生成。以下是後者的一個示例:

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欺騙,我認爲它可能值得問:) :)在保存()點我可以做別的,謝謝兩個輸入。 – Rasta

相關問題