【问题标题】:Cannot assign "[u'192.168.99.1', u'192.168.99.1']": "MultiWAN.nameserver" must be a "NameServer" instance无法分配“[u'192.168.99.1', u'192.168.99.1']”:“MultiWAN.nameserver”必须是“NameServer”实例
【发布时间】:2012-05-25 11:44:46
【问题描述】:

考虑以下 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:

当我试图保存时,我得到了上述错误。请帮助我哪里出错了。

【问题讨论】:

  • 您应该使用 ModelForm。

标签: python django django-models foreign-keys


【解决方案1】:

您在 NameServer 模型上将 MultiWAN.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),因为它会清理大部分输入并负责验证。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多