2016-05-16 5 views
1

Ich habe IPAddr Modell, und ich vorbefüllt die Tabelle mit Daten (IP-Adresse). Und es hat Feld verfügbar standardmäßig ist es wahr, alle ip's verfügbar.Django Modell benutzerdefinierte Methoden zur Abfrage und Aktualisierung des Feldes

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) 

Also, was tun möchte, ist ich brauche ein Modell methold nennen es gib mir die erste Availble ip und es ist availble Wert ändern = False. Anregungen sind willkommen

Antwort

0

Beide Antworten, die Sie erhalten haben guten sind, aber es gibt einen kleinen Extraschritt. Sie müssen sicherstellen, dass dies in einem atomaren Block geschieht. Andernfalls können Sie feststellen, dass zwei verschiedene Instanzen die gleiche IP-Adresse erhalten und zu IP-Adresskonflikten führen.

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 

Beachten Sie die Verwendung von select_for_update

+0

genial Dank. – msr

+0

Ich bin froh, dass ich geholfen habe. Wenn sich meine Antwort oder eine der Antworten der anderen als richtig herausstellte, sei bitte so freundlich, sie zu akzeptieren. Das ist die übliche Vorgehensweise hier, damit jemand, der in Zukunft auf der Seite landet, weiß, was die Lösung ist. – e4c5

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

testen

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

Dank für das Ihnen helfen, – msr

Verwandte Themen