Python 在保存时使用主键创建字段说明

Python 在保存时使用主键创建字段说明,python,django,Python,Django,我对Django还是新手,所以请容忍我 我想根据保存时该条目的主键在同一个表中设置另一个字段。更准确地说: 我的模型(示例): 我希望状态描述类似于: 状态为“+status_name+”,而ID为:“+str([Primary]) 键]) 显然,在插入记录之前,我不会拥有主键。有没有一种方法可以创建一个函数,在我插入记录后立即更新它 我已尝试重写save方法,但如果再次使用save(),显然会创建一个无限循环 (请注意,这是一个示例,我实际上要做的是创建与该记录相关的几个ID的散列,包括该记录

我对Django还是新手,所以请容忍我

我想根据保存时该条目的主键在同一个表中设置另一个字段。更准确地说:

我的模型(示例):

我希望状态描述类似于:

状态为“+status_name+”,而ID为:“+str([Primary]) 键])

显然,在插入记录之前,我不会拥有主键。有没有一种方法可以创建一个函数,在我插入记录后立即更新它

我已尝试重写save方法,但如果再次使用save(),显然会创建一个无限循环

(请注意,这是一个示例,我实际上要做的是创建与该记录相关的几个ID的散列,包括该记录的主键。如果我有这个功能,我可能可以完成其余的工作。DB上的触发器对我不起作用。)


谢谢你的帮助

您使用的是什么Django版本?我相信Django 1.7+就是您想要的(准确地说是
post_save
信号)

更新:

您将得到一个包含其他答案的无限循环,因为它们调用
instance.save()
,这将无限地触发
post\u save
事件。您应该有一个
if
语句,该语句仅在
status\u description
不为空时才重新保存实例,即:

if instance.status_description in [None, '']:
    instance.status_description = <Get ID of the instance here>
    instance.save()
if instance.status_说明在[None',]中:
instance.status_description=
save()实例

现在,第一次创建对象时,将触发信号并调用
update\u status
函数,设置实例的
status\u description
属性。然后,
if
语句将被求值为True,实例的
save
方法将再次被调用。然后将再次触发
post\u save
事件,但这次
status\u description
属性将不再是
'
,实例将不会再次保存。

您可以使用
django接收器使用
post\u save
。在
status\u description
字段中定义
null=True,blank=True

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

多亏了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()

您可以尝试后保存触发器。是否确实要将描述保存到数据库中?最好有一个基于实例的值动态返回的方法。不幸的是,这会导致无限循环:RuntimeError:超过最大递归深度。@dengar81您如何将数据提供给模型?我使用的是交互式shell。s=Status(Status\u name=“Hello”)&&s.save()尝试
update
sender.objects.filter(id=instance.id)。update(Status\u description=instance.Status\u description
)我使用的是1.7.6,所以是的,信号是一个选项。其他两个帖子也这么说。我读了这一页,但是你能用一个例子来详细说明吗?我已经更新了我的答案,解释了为什么会出现递归错误。谢谢你。当然,使用if是有意义的。但是你的确切代码不起作用,因为if是错误的。我需要检查它是否为None或“”,然后执行操作。否则什么也没有。请参阅下面的我的解决方案,然后向上投票,这样可以更容易地找到它…你是对的,我把
if
语句弄糟了:)我更新了我的答案。
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()