2016-05-16 61 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

相关问题