【问题标题】:Django - how to get the field value before saving?Django - 如何在保存之前获取字段值?
【发布时间】:2016-06-29 02:46:30
【问题描述】:

我是 Django 新手 在保存之前,我一直在尝试从模型字段中获取值,例如:

class Student(models.Model):
    name = models.CharField(max_length=30, null=False)
    id = models.CharField(max_length=30, null=False, primary_key=True)
    phone = models.BigIntegerField(max_length=50, null=False)


def print_name():
    #here I want to catch and print the student's name before it saves

我阅读了有关 pre_save 方法的信息,但我仍然无法管理如何获取当前名称。

【问题讨论】:

    标签: python django models


    【解决方案1】:

    只需覆盖模型中的 save 方法即可。

    class Student(models.Model):
        name = models.CharField(max_length=30, null=False)
        id = models.CharField(max_length=30, null=False, primary_key=True)
        phone = models.BigIntegerField(max_length=50, null=False)
    
        def save(self):
            print self.name
            super(Student, self).save()
    

    【讨论】:

    • 谢谢!所以有了这个,我可以连接两个(或更多)字段并生成,比如说一个带有当前字段的代码我正在保存:def save(self): student_code = self.name + str(self.id) code = models .CharField(max_length=50, null = False, default= student_code) super(Student, self).save()
    • 是的,但您必须在模型类中指定结果字段。 code = models.CharField(max_length=50, null = False) 保存它会是,self.code = self.name + str(self.id); super(Student, self).save()
    【解决方案2】:

    由于某种原因,没有一个答案对我有用。

    我仍然能够通过从数据库中检索对象并将其与保存的版本进行比较来解决问题:

    def save(self, *args, **kwargs):
        old_object_instance = YourModel.objects.get(pk=self.pk)
        if old_object_instance.your_value != self.your_value:
            do_something_here()
        super().save(*args, **kwargs)
    

    【讨论】:

      【解决方案3】:

      您可以通过像这样覆盖默认的save 方法来实现这一点。

      class Student(models.Model):
          name = models.CharField(max_length=30, null=False)
          id = models.CharField(max_length=30, null=False, primary_key=True)
          phone = models.BigIntegerField(max_length=50, null=False)
          def save(self, *args, **kwargs):
              print self.name
              super(Student, self).save(*args, **kwargs)
      

      【讨论】:

        【解决方案4】:

        不管是在save()方法还是在模型类中的任何其他方法中,你都可以使用引用当前实例的self访问任何模型属性:

        class Student(models.Model):
            name = models.CharField(max_length=30, null=False)
            id = models.CharField(max_length=30, null=False, primary_key=True)
            phone = models.BigIntegerField(max_length=50, null=False)
        
            def any_function(self, any_arg1, any_arg2):
               ...  
               print self.name
               return self.name
        

        【讨论】:

          【解决方案5】:

          这里我给你另一个使用pre_save信号的解决方案

          from django.db.models.signals import pre_save
          from django.dispatch import receiver
          
          @receiver(pre_save, sender=YourModel)
          def my_callback(sender, instance, *args, **kwargs):
              print instance.name
          

          【讨论】:

          • 我们也可以将会话数据放入pre_save吗??
          猜你喜欢
          • 2012-02-14
          • 1970-01-01
          • 2014-06-15
          • 2012-02-05
          • 2021-09-29
          • 1970-01-01
          • 2012-11-16
          • 2020-04-15
          • 1970-01-01
          相关资源
          最近更新 更多