0

考虑以下 django 模型

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 上有一个外键。

附带说明:您应该真正使用 Form(或 ModelForm),因为它会清理大部分输入并负责验证。

于 2012-05-25T12:25:15.730 回答
0

正如 bruno 所说,您必须传递一个 NameServer 对象,因为您将字段声明为 ForeignKeys,但还要考虑在 NameServer 是否存在之前检查。一个好的做法是使用objects.get_or_create而不是 create。

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

这样,您将收到名称服务器实例,并且 is_new 将是 True 或 False ,具体取决于是否创建了对象。

于 2012-05-25T18:14:48.587 回答