Python Django-pre_保存信号中的get auto_now字段
我正在使用Django 2.1.5 有一个模型具有“auto_now”字段:Python Django-pre_保存信号中的get auto_now字段,python,django,signals,Python,Django,Signals,我正在使用Django 2.1.5 有一个模型具有“auto_now”字段: class BaseModel(models.Model): id = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True, unique=True, primary_key=True) updated_at = models.DateTimeField(db_index=True, auto_now=True)
class BaseModel(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True, unique=True, primary_key=True)
updated_at = models.DateTimeField(db_index=True, auto_now=True)
updated_by = models.CharField(max_length=200)
responded_at = models.DateTimeField(db_index=True, null=True, blank=True)
responded_by = models.CharField(max_length=200, null=True, blank=True)
现在,我有一个该型号的pre_save
信号,我想在那里更新responsed_at
和responsed_by
字段,使其等于updated_at
和updated_by
。在该信号中,updated\u by
值已经是新的值,应该在请求末尾,但是处的updated\u不是。它是旧(当前)值。
如果可能的话,我希望能够在保存后在
字段中获得updated_中应该存在的值
我之所以使用pre\u save
信号而不是post\u save
,是因为我正在更新其中的实例 由于您现在在
字段中使用的是auto\u
和updated\u,因此它将继承editable=False
和blank=True
作为国家:
按照当前的实现,将auto_now或auto_now_add设置为True将导致字段设置为editable=False和blank=True
为了避免这种情况,可以编写如下自定义字段:
from django.utils import timezone
class AutoDateTimeField(models.DateTimeField):
def pre_save(self, model_instance, add):
return timezone.now()
class BaseModel(models.Model):
updated_at = models.AutoDateTimeField(default=timezone.now)
# ...
您可以在BaseModel
中这样使用它:
from django.utils import timezone
class AutoDateTimeField(models.DateTimeField):
def pre_save(self, model_instance, add):
return timezone.now()
class BaseModel(models.Model):
updated_at = models.AutoDateTimeField(default=timezone.now)
# ...
这样,updated\u at
字段应该是可编辑的,您的信号应该可以工作。因为您现在正在使用auto\u
和updated\u at
字段,它将继承editable=False
和blank=True
作为国家:
按照当前的实现,将auto_now或auto_now_add设置为True将导致字段设置为editable=False和blank=True
为了避免这种情况,可以编写如下自定义字段:
from django.utils import timezone
class AutoDateTimeField(models.DateTimeField):
def pre_save(self, model_instance, add):
return timezone.now()
class BaseModel(models.Model):
updated_at = models.AutoDateTimeField(default=timezone.now)
# ...
您可以在BaseModel
中这样使用它:
from django.utils import timezone
class AutoDateTimeField(models.DateTimeField):
def pre_save(self, model_instance, add):
return timezone.now()
class BaseModel(models.Model):
updated_at = models.AutoDateTimeField(default=timezone.now)
# ...
这样,updated\u at
字段应该是可编辑的,您的信号应该可以工作。谢谢,但这不是我想要的。我想在
处获取updated\u的值,就好像我在post\u save中一样,并将其放在
处的responsed\u中。我不想编辑updated_at
如果您想在BaseModel
对象更改时获取updated_at
的值并将其保存在responsed_at
字段中,我不明白为什么您不想创建一个从DateTimeField
继承的自定义字段,以使您的信号工作?谢谢,但这不是我想要的。我想在
处获取updated\u的值,就好像我在post\u save中一样,并将其放在
处的responsed\u中。我不想编辑updated_at
如果您想获取updated_at
的值并将其保存在responsed_at
字段中,每当BaseModel
对象被更改时,我不明白为什么您不想创建一个从DateTimeField
继承的自定义字段以使信号工作?