Django模型自定义方法,使查询和更新字段
问题描述:
我有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的=假。 任何建议表示赞赏
答
你已经收到是好的这两个答案,但有一个小的额外步骤。你需要确保这发生在一个原子块中。否则,您可能会发现两个不同的实例获得相同的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
答
@staticmethod
def getip():
# what should i do ?
ip = IPAddr.objects.filter(available=True).first()
ip.available=False
ip.save()
return ip
答
试试这个
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
真棒感谢。 – msr
很高兴有帮助。如果我的答案或其他答案中的一个答案证明是正确的,请尽量接受它。这是通常的做法,以便将来登录该网页的人将知道该解决方案是什么。 – e4c5