每adding a **kwarg to a class 我正在将cn__domainname转换为cn。 我是否在案例的正确轨道'cn'是一个整数或字符串首先将其转换为域名实例,还是应该在验证器中执行此操作?
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'))
答案 0 :(得分:0)
我认为在你的机器模型中,在__init__
方法中我会像这样检查:
if getattr(self.cn, 'domainname'):
无论如何,看起来很乱。
使用信号怎么样? https://docs.djangoproject.com/en/dev/topics/signals
创建计算机记录时触发创建域记录。另外,检查域的整数或字符串是否应该在域上。
要回答您的问题,我认为您不在 djangoist 路径中。