2017-07-28 121 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

相关问题