2014-02-28 76 views
0

創建新對象我是新來的Django,我試圖做一些很簡單的關聯對象的數據。 我的models.py是如下:如何修改whilie在Django

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」對象「大小」,以減少相關的盤驅動對象的「自由空間」屬性的值。我應該怎麼做?請幫助像一個post_save信號完美的工作......

回答

3

聲音:

@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更新時 - 不僅僅在StoragePool創建時,您可能還想調整freeSpace屬性。要做到這一點只是刪除if created檢查,它會在每個StoragePool.save()

+0

它的工作運行....謝謝pajton。只是一個小編輯(對於那些誰是新的Django和我一樣):粘貼models.py和進口上面的代碼如下:從django.dispatch進口接收機 從django.db.models.signals從django.db導入post_save .models import F – shailesh88

+0

很高興能幫到你!我傾向於在我的答案中省略進口,爲OP留下一些樂趣;-) – pajton