我是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'属性的值。我该怎么做?请帮忙......
答案 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
上运行