【问题标题】:fill with a default value in a blank/null False foreignkey field in Django model在 Django 模型中的空白/空假外键字段中填充默认值
【发布时间】:2015-11-02 08:01:12
【问题描述】:
class MyModel(models.Model):
     field1 = models.ForeignKey('AnotherModel', null=False, blank=False)
     field2 = #its a choice field
     # some more fields

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

我尝试了重写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'

我该怎么做?

【问题讨论】:

  • I gave it a try by overriding save() method but not successful 并没有真正帮助,您的具体错误情况是什么。
  • @HeddevanderHeide:当我尝试使用 django admin 保存此模型并将字段 1 留空但字段 2 具有特定值时,一旦我单击保存按钮,它就会显示这是必填字段并且不保存. This field is required. 错误出现在 RED 背景中
  • 显然因为您将 null 和 blank 都设置为 False,您可以删除它们并手动清理它们吗?
  • 那么你有解决这个问题的办法吗?
  • 我的意思是,如果你只是在 python shell 中调用instance.save(),它应该可以工作,因为不会调用验证。所以要让它在 django 管理员中工作,你需要自定义模型上的验证。

标签: python django django-models django-signals


【解决方案1】:

如果我是你,我会做清洁工作,但我也看到人们使用 @property 和 @func.setter 让它添加功能 - 所以如果我设置 field1,setter 也会相应地设置 field2已分配。

您可以在清理时执行此操作 - 因此,如果该字段为空白=True 但不是 null=True,您可以保存该字段,并且清理将是执行逻辑的地方。这将允许您 sa​​ve() 模型并通过验证(由于空白=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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多