Django - 如何在保存前获取字段值?

时间:2016-03-14 06:49:50

标签: python django models

我是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方法,但我仍然无法管理如何获取当前名称。

5 个答案:

答案 0 :(得分:2)

只需覆盖模型中的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()

答案 1 :(得分:0)

您可以通过覆盖默认的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)

答案 2 :(得分:0)

如果在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

答案 3 :(得分:0)

在这里,我使用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

答案 4 :(得分:0)

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

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

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)