在保存时使用主键创建字段描述

时间:2015-11-18 13:22:21

标签: python django

我还是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的哈希,包括记录的主键。如果我有这个工作,我可能做其余的。数据库上的触发器对我不起作用。)

感谢您的帮助!

3 个答案:

答案 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()