Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django model uuu init uuuuuuuu额外kwarg和kwarg类型错误时的处理_Django_Django Models - Fatal编程技术网

django model uuu init uuuuuuuu额外kwarg和kwarg类型错误时的处理

django model uuu init uuuuuuuu额外kwarg和kwarg类型错误时的处理,django,django-models,Django,Django Models,我正在将cn__域名转换为cn的正确轨道上。 对于“cn”是一个整数还是一个字符串,首先将其转换为domainname实例的情况,我的思路正确吗?还是应该在验证器中这样做 class DomainName(models.Model): domainname = models.CharField(max_length=256, unique=True, validators=[DomainNameValidator]) def __unicode__(sel

我正在将cn__域名转换为cn的正确轨道上。 对于“cn”是一个整数还是一个字符串,首先将其转换为domainname实例的情况,我的思路正确吗?还是应该在验证器中这样做

class DomainName(models.Model):
    domainname = models.CharField(max_length=256, unique=True,
            validators=[DomainNameValidator])
    def __unicode__(self):
        return u'%s: domainname=%s' % ( self._meta.object_name, 
                self.domainname.__repr__())

class Machine(models.Model):
    cn = models.OneToOneField(DomainName, primary_key=True)
    #...
    ips = models.ManyToManyField(IP)
    def __unicode__(self):
        return u'%s: cn=%s' % (self._meta.object_name, self.cn.domainname)
    def __init__(self, *args, **kwargs):
        cn__domainname=kwargs.pop('cn__domainname',None)
        cn=kwargs.pop('cn',cn__domainname)
        if cn:
            if isinstance(cn,DomainName):
                kwargs['cn']=cn
            elif isinstance(cn,int):
                kwargs['cn']=DomainName.objects.get(id=cn)
            elif isinstance(cn,(str,unicode)):
                kwargs['cn']=DomainName.objects.get_or_create(domainname=cn)[0]
        super(Machine,self).__init__(*args, **kwargs)
目标是能够做到

m,created=Machine.objects.get_or_create(cn__domainname='foo')
而不是

m,created=Machine.objects.get_or_create(
    cn__domainname='foo',
    defaults=dict(cn=DomainName.objects.get_or_create(domainname='foo'))

我认为在您的机器型号中,在
\uuuuu init\uuuu
方法中,我将检查如下:

 if getattr(self.cn, 'domainname'):
不管怎样,看起来很乱

使用信号怎么样

创建计算机记录时,触发域记录的创建。另外,检查域的整数或字符串是否应位于域上

为了回答你的问题,我认为你没有走上民主的道路