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()