2016-05-16 10 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) 

だから何をしたいのか、私は私の最初のavailble IPを与えることだモデルmetholdを呼び出し、それを変更する必要がある値のavailble = Falseのです。 任意の提案が高く評価されて

答えて

0

あなたが受け取っている両方の答えは良いものですが、小さな余分なステップがあります。これがアトミックブロックで行われることを確認する必要があります。そうでなければ、2つの異なるインスタンスが同じ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

関連する問題