Django模型自定义方法,用于查询和更新字段

时间:2016-05-16 11:10:39

标签: django django-models

我有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。 任何建议表示赞赏

3 个答案:

答案 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