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

2024-09-28 22:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我是刚到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和url.py添加任何内容。 我可以创建这两个类的对象。 每当我创建StoragePool类的对象时,我都希望将相关DiskDrive对象的“freeSpace”属性的值减少“StoragePool”对象的“size”。我该怎么做?请帮忙


Tags: 对象djangokeypyselfmodelmodelslength
1条回答
网友
1楼 · 发布于 2024-09-28 22:24:08

听起来像是一个完美的工作后保存信号:

@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端的任何内容(当多个客户机将创建新的StoragePool对象时,这将确保正确的值)

  • size被更新时,很可能您也想调整freeSpace属性—而不仅仅是在StoragePool创建时。要做到这一点,只需删除if created检查,它将在每个StoragePool.save()

相关问题 更多 >