在Django模型中,用一个默认值填充一个空白/null的False外键字段


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_save, pre_init, post_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'

我该怎么做?

如果我是你,我就会在清理的地方这样做,但我也看到有人使用@property和@func。如果我设置了field1, setter也会相应地设置field2。

您可以在清理时执行此操作-因此,如果字段为blank=True但不是null=True,则可以保存该字段,并且清理将在逻辑执行的地方执行。这将允许您保存()模型并通过验证(由于blank=True,我可以调用save方法而不会出错,或手动设置它),并且我的清理确保在保存完成之前通过分配仍然满足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()

最新更新