我还是Django的新手,所以请耐心等待......
我想根据保存时该条目的主键在同一个表中设置另一个字段。更确切地说:
我的模特(例子):
class Status(models.Model):
status_name = models.CharField(max_length=10)
status_description = models.CharField(max_length=30)
def __str__(self):
return self.status_description
我希望status_description类似于:
“状态为”+ status_name +“,而ID为:”+ str([Primary 键])
显然,在插入记录之前,我不会有主键。有没有办法创建一个在插入记录后立即更新记录的函数?
我试过覆盖了save-method,但如果你再次保存(),这显然会产生无限循环。
(请注意,这是一个例子,我实际上要做的是创建一个与该记录相关的几个ID的哈希,包括记录的主键。如果我有这个工作,我可能做其余的。数据库上的触发器对我不起作用。)
感谢您的帮助!
答案 0 :(得分:1)
你使用的Django版本是什么? Django 1.7+有signals我相信你正在寻找的东西(post_save
信号是准确的)。
<强>更新强>
您正在使用其他答案获得无限循环,因为他们调用instance.save()
无限触发post_save
事件。您应该有if
语句,只有在status_description
不为空时才重新保存实例,即:
if instance.status_description in [None, '']:
instance.status_description = <Get ID of the instance here>
instance.save()
现在,第一次创建对象时,将触发信号并调用update_status
函数,设置实例的status_description
属性。然后,if
语句将被计算为True,并且将再次调用实例的save
方法。然后会再次触发post_save
事件,但这次status_description
属性不会是''
,并且实例不会再次保存。
答案 1 :(得分:1)
您可以使用post_save
使用django receiver
。另请在null=True, blank=True
字段中定义status_description
。
from django.db.models.signals import post_save
from django.dispatch import receiver
class Status(models.Model):
status_name = models.CharField(max_length=10)
status_description = models.CharField(max_length=30, null=True, blank=True)
@receiver(post_save, sender=Status):
def status_desc(sender, instance, **kwargs):
instance.status_description = "The status is " + instance.status_name + ", while the ID is: " + str(instance.id)
# save the instance
instance.save()
答案 2 :(得分:1)
感谢DeepSpace为我工作的人。我用过的完整解决方案是:
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
# Create your models here.
class Status(models.Model):
status_name = models.CharField(max_length="50")
status_description = models.CharField(max_length="1000", blank=True, null=True)
def __str__(self):
return self.status_name
@receiver(post_save, sender=Status)
def status_desc(sender, instance, **kwargs):
if instance.status_description in [None, '']:
instance.status_description = str(instance.id)
instance.save()