2013-03-21 52 views
0

adding a **kwarg to a class 我正在將cn__domainname轉換爲cn的正確軌道。 我在案例'cn'的正確軌道是一個整數或字符串首先將其轉換爲域名實例,或者我應該在驗證程序中執行此操作?django模型__init__額外kwarg和處理,如果kwarg是錯誤的類型

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

我想在你的機器型號,在__init__方法我會檢查這樣的:

if getattr(self.cn, 'domainname'): 

An一路上,看起來很凌亂。

使用信號怎麼樣? https://docs.djangoproject.com/en/dev/topics/signals

當創建一個機器記錄觸發創建一個域記錄。此外,檢查域的整數或字符串是否應該在域上。

要回答你的問題,我認爲你不在djangoist路徑。