2016-05-16 62 views
1

我有IPAddr模型,我預先填充表中的數據(IP地址)。並且它有可用默認情況下它是真實的所有ip可用。Django模型自定義方法,使查詢和更新字段

from django.db import models 
class IPAddr(models.Model): 
    ipaddress = models.CharField(max_length=100) 
    available = models.BooleanField(default=True) 

    def __str__(self): 
     return self.ipaddress 
    @static 
    def getip(self): 
    # what should i do ?  

class Vm(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    instrument = models.CharField(max_length=100) 
    ipaddr = models.OneToOneField(IPAddr,on_delete=models.CASCADE,default=0) 

那麼想做的事就是我需要調用一個模型methold它給我的第一availble的IP,並改變它的值availble的=假。 任何建議表示讚賞

回答

0

你已經收到是好的這兩個答案,但有一個小的額外步驟。你需要確保這發生在一個原子塊中。否則,您可能會發現兩個不同的實例獲得相同的IP地址並導致IP地址衝突。

from django.db import transaction 


@staticmethod 
@transaction.atomic 
def getip(): 
    # what should i do ? 
    ip = IPAddr.objects.select_for_update().filter(available=True).first() 
    ip.available=False 
    ip.save() 
    return ip 

注意使用select_for_update

+0

真棒感謝。 – msr

+0

很高興有幫助。如果我的答案或其他答案中的一個答案證明是正確的,請儘量接受它。這是通常的做法,以便將來登錄該網頁的人將知道該解決方案是什麼。 – e4c5

0
@staticmethod 
def getip(): 
    # what should i do ? 
    ip = IPAddr.objects.filter(available=True).first() 
    ip.available=False 
    ip.save() 
    return ip 
0

試試這個

class IPAddr(models.Model): 
    ... 
    @classmethod 
    def getip(cls): 
     ip = cl.objects.filter(available=True).first() 
     ip.available=False 
     ip.save() 
     return ip 

class Vm(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    instrument = models.CharField(max_length=100) 
    ipaddr = models.OneToOneField(IPAddr,on_delete=models.CASCADE,default=0) 


    def save(self, *args, **kwargs): 
     ip = IPAddr.getip() 
     self.ipaddr = ip 
     super(Vm, self).save(*args, **kwargs) 
+0

感謝您的幫助, – msr

相關問題