Django 信号如何去改变一个字段属性

1、Receive有Asset的外健,在领取其中一个资产的时候如何把status的值也给改变呢 ?

2、代码:

ASSET_STATUS = (
    (0, u"空闲"),
    (1, u"领用"),
    (2, u"借用")
)
class Asset(models.Model):
    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    asset_code = models.CharField(verbose_name=u'资产编码', max_length=128)

    status = models.IntegerField(verbose_name=u'资产状态', choices=ASSET_STATUS, default=0)

    brand = models.CharField(verbose_name=u"资产品牌", max_length=64, choices=[(i, i) for i in (
        u'Apple', u"DELL", u"HP", u'Microsoft', u'联想', u'三星', u'Acer ', u'ASUS', u"Other")])
    sn = models.CharField(verbose_name=u"序列号", max_length=64)
    buy_date = models.DateField(verbose_name=u"购买日期")
    mac_address = models.CharField(verbose_name=u"MAC地址", blank=True, null=True, max_length=64)
    cpu = models.CharField(verbose_name=u"CPU型号", max_length=64, blank=True, null=True)
    hard_disk = models.IntegerField(verbose_name=u"硬盘大小", blank=True, null=True)
    memory = models.IntegerField(verbose_name=u"内存大小", blank=True, null=True)
    system = models.CharField(verbose_name=u"预装系统", max_length=32, blank=True, null=True,
                              choices=[(i, i) for i in (u"CentOS", u"FreeBSD", u"Ubuntu", u"Windows", u"Mac os", u"无")])
    description = models.TextField(verbose_name=u"描述", blank=True, null=True)

    class Meta:
        verbose_name = u"资产列表"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.asset_name


class Receive(models.Model):
    people = models.ForeignKey(User, blank=True, null=True, verbose_name=u"领用人")
    asset = models.ForeignKey(Asset, verbose_name=u'资产', null=True)
    collar_time = models.DateField(u"领用时间", )
    operation_notes = models.TextField(u"描述", )


    def __str__(self):
        return str(self.people)

    class Meta:
        verbose_name = u'领用'
        verbose_name_plural = u'领用'

3、是否能用信号的方式来实现,还是有其他更好的方法来实现,非常感谢回答者对我的解惑。

阅读 3.4k
4 个回答

参考相关的Signals文档
http://python.usyiyi.cn/trans...
https://docs.djangoproject.co...

from django.dispatch import receiver
from django.db.models.signals import post_save

@receiver(post_save, sender=Receive)
def change_status_handler(sender, **kwargs):
    if kwargs['created']:
        obj = kwargs['instance']
        obj.asset.status = 1
        obj.save()

不建议使用信号的方式处理这类问题。
属于业务逻辑的代码一般在views视图中处理的时候完成。

添加一条领用记录,然后在post_save signal中把库存数量减1?
可能需要调整model设计,让流程更顺

创建Receive记录后就自动改了。

from django.db.models.signals import post_save,post_delete
def change_status(sender, instance, created, **kwargs):
    if created:
        instance.asset.status = 1
        instance.save()
post_save.connect(change_status, sender=Receive, dispatch_uid="change_asset_status")