【问题标题】:How to change input fields while overriding a django save() method如何在覆盖 django save() 方法时更改输入字段
【发布时间】:2013-07-20 00:13:54
【问题描述】:

假设我有以下代码:

 class MyModel(models.Model):
     ...
     ...

    def save(self, *args, **kwargs):
        # pre-save edits can go here...
        super(MyModel, self).save(*args, **kwargs)

当我创建并保存模型 MyModel(blah, blah, blah) 时,有可能 输入字段之一是“无”。在覆盖的保存方法中,目标是检查字段是否为空,如果是,则将其更改为其他默认值。

输入字段是 args 还是 kwargs?覆盖 save() 甚至是正确的方法吗?

我在想这样的事情:

    def save(self, *args, **kwargs):
        if 'username' in args and args['username'] is None:
              args['username'] = some_default_value
        super(MyModel, self).save(*args, **kwargs)

那么输入参数在哪里? args* 或 **kwargs,谢谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为最好使用pre_save 信号来查看输入值是否为None

    from django.db import models
    from django.db.models.signals import pre_save
    from django.dispatch import receiver
    
    class MyModel(models.Model):
        field1 = models.TextField()
        field2 = models.IntegerField()
    
    @receiver(pre_save, sender=MyModel)
    def mymodel_save_handler(sender, instance, *args, **kwargs):
         if instance.field1 is None or instance.field1 == "":
             instance.field1 = default_value
    

    如果您更喜欢覆盖save 方法,您可以使用self 访问model fields

     def save(self, *args, **kwargs):
            if self.username is None:
                  self.username = some_default_value
            super(MyModel, self).save(*args, **kwargs)
    

    【讨论】:

    • 我得到一个编译错误,你确定 sender=MyModel 不应该是 sender='MyModel'?
    • 谢谢,如果还有人可以帮忙,还是有点好奇。覆盖 save() 方法时,可以在哪里访问实例字段?是在 args 还是 kwargs 中?
    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 2019-10-13
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2018-02-05
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多