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'
我该怎么做?
答案 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()