如何在django中创建新对象时修改相关对象的数据

时间:2014-02-28 17:35:29

标签: python django

我是django的新手,我正在尝试做一些非常简单的事情。 我的models.py如下:

from django.db import models

class DiskDrive(models.Model):
    deviceId = models.CharField(max_length=64, primary_key=True)
    freeSpace = models.BigIntegerField()

    def __unicode__(self):
        return self.deviceId


class StoragePool(models.Model):
    poolId = models.CharField(max_length=256, primary_key=True)
    size = models.BigIntegerField()
    drive = models.ForeignKey(DiskDrive, related_name='pools')

    def __unicode__(self):
        return self.poolId 

我还没有向views.py和urls.py添加任何东西。 我能够创建两个类的对象。 每当我创建StoragePool类的对象时,我想通过'StoragePool'对象的'size'来减少相关DiskDrive对象的'freeSpace'属性的值。我该怎么做?请帮忙......

1 个答案:

答案 0 :(得分:3)

听起来像post_save信号的完美工作:

@receiver(post_save, sender=StoragePool)
def update_drive_space(sender, instance, created, **kwargs):
    if created:
        instance.drive.freeSpace = F('freeSpace') - instance.size
        instance.drive.save(update_fields=['freeSpace'])

有关信号如何工作的详细信息,请参阅Django signals documentation。简而言之,每次创建或更新StoragePool对象时都会调用此方法。

很少注意到:

  • 我使用F expression来引用当前数据库size值,而不是盲目地保存我们在Django端的任何内容(当多个客户端创建新{{1}时,这将确保正确的值对象)

  • 您可能希望在更新StoragePool时调整freeSpace属性 - 而不仅仅是size创建时。要做到这一点,只需删除StoragePool检查,它就会在每个if created上运行