在Django模型的空/空False外键字段中填入默认值

时间:2015-08-10 11:59:50

标签: python django django-models django-signals

class MyModel(models.Model):
     field1 = models.ForeignKey('AnotherModel', null=False, blank=False)
     field2 = #its a choice field
     # some more fields

如果field1等于某个特定值(来自选择元组),我想要的是用field2填充默认值。

我尝试重写save()方法,但我没有成功。

def save(self, *args, *kwargs):
   if self.field2 == 'some-specific-value':
      self.field1 = 'some-default-value or a dummy object id?'

对于其他选择值字段(field2),用户必须提供一个值,但如上所述,对于特定值,我们将使用默认字/字符串填充。

我甚至尝试使用信号pre_savepre_initpost_init,但没有成功

@receiver(post_init, sender=MyModel)
def populate_field1(sender, instance, *args, **kwargs):
    print 'in signal'
    if instance.field2 == 'some-specific-value':
          instance.field1 = 'some-default-value'

我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果我是你,那么清洁是我会这样做的,但我也看到人们使用@property和@ func.setter来添加功能 - 所以如果我设置了field1,那么setter也会相应地设置field2,因为它是分配

您可以在清理时执行此操作 - 因此,如果该字段为空= True但不为null = True,则可以保存该字段,清理将是逻辑执行的位置。这将允许你保存()模型并通过验证(因为空白=真,我可以调用保存方法而不会出错,或者手动设置它),我的清理确保仍然满足null = False条件之前通过分配保存完成。

class MyModel(models.Model):
     field1 = models.ForeignKey('AnotherModel', null=False, blank=False)
     field2 = #its a choice field
     # some more fields

     def clean(self):
         if self.field2.field == 'value':
             self.field1 = AnotherModel.logic.to.get_the_right_(one)
         else:
             self.field1 = AnotherModel.some_default(value)

这是一个我做过类似但依赖性较小的例子:

class Domain(models.Model):
    class Meta:
        ordering = ['domain_name']

    domain_id = models.CharField(max_length=255, unique=True, blank=True)
    domain_name = models.CharField(max_length=255, unique=True)
    domain_arrays = models.ManyToManyField('Array', blank=True)

    def __str__(self):
        return self.domain_name

    def clean(self):
        self.domain_id = self.domain_name.lower().replace('.', '_')
        self.domain_name = self.domain_name.lower()