0

次のジャンゴモデルを検討してください

class MultiWAN(models.Model):

    isp_name = models.CharField(max_length=10)
    description  = models.TextField(null=True)
    ip_address   = models.IPAddressField(null=True)
    subnet       = models.IPAddressField(null=True)
    gateway      = models.IPAddressField(null=True)
    nameserver   = models.ForeignKey('NameServer')
    weight       = models.IntegerField(null=False)
    interface    = models.CharField(max_length=5) 



class NameServer(models.Model):
    """  A Isp can have more than one nameserver so far we are declearing a seperate table 
    """         
    name = models.IPAddressField(null=False)    

ユーザー入力を取得してデータベースに保存するための対応するビューを作成しました

def multiwan_info_save(request):

  #  try:
        isp_nm = request.POST['ispname_mw']
        desc_mw  = request.POST['desc_mw']
        ip_address_mw  = request.POST['ip_address_mw']
        subnet_mw = request.POST['subnet_mw']
        nameserver_mw = request.POST.getlist('nameserver_mw')
       # nameserver2_mw = request.POST['nameserver2_mw']
        gateway_mw = request.POST['gateway_mw']
        weight_mw = request.POST['weight_mw']
        interface_mw = request.POST['interface_mw']
        print "+++++++++++++++================="
        print nameserver_mw
        nmservr = NameServer()
        mv = MultiWAN(isp_name=isp_nm,description=desc_mw,ip_address=ip_address_mw,subnet = subnet_mw,gateway=gateway_mw,weight=weight_mw,interface = interface_mw,nameserver = nameserver_mw)

        mv.save()
    #except:

保存しようとしているときに、上記のエラーが表示されます。どこが間違っているのか教えてください。

4

2 に答える 2

2

MultiWAN.nameserverをNameServerモデルの外部キーとして定義したため、単一のNameServerインスタンスをMultiWANに渡す必要があります。

nameserver = NameServer.objects.create(name="XXX.XXX.XXX.XXX")
mv = MultiWan.objects.create(nameserver=nameserver, ....)

IPアドレスのリストを渡していることを考えると、MultiWANとNameServerの関係が間違っていると思います。代わりにNameServerにMultiWANの外部キーを持たせたいようです。

補足として:ほとんどの入力をサニタイズし、検証を処理するため、代わりにフォーム(またはModelForm)を実際に使用する必要があります。

于 2012-05-25T12:25:15.730 に答える
0

ブルーノが言うように、フィールドを ForeignKeys として宣言するため、NameServer オブジェクトを渡す必要がありますが、NameServer が存在するかどうかを事前に確認することも検討してください。これには、create の代わりにobjects.get_or_createを使用することをお勧めします。

nameserver, is_new = NameServer.objects.get_or_create(name='...')

このようにしてネームサーバーインスタンスを受け取り、オブジェクトが作成されたかどうかに応じて is_new が True または False になります。

于 2012-05-25T18:14:48.587 に答える