我有IPAddr模型,我预先用数据(IP地址)填充表格。它默认情况下有字段,所有ip都可用。
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)
所以想要做的是我需要调用一个模型方法,它给我第一个可用的ip并改变它的值availble = False。 任何建议表示赞赏
答案 0 :(得分:0)
@staticmethod
def getip():
# what should i do ?
ip = IPAddr.objects.filter(available=True).first()
ip.available=False
ip.save()
return ip
答案 1 :(得分: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)
答案 2 :(得分: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