0

クラスに**kwargを追加することにより、私 は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'))
4

1 に答える 1

0

私はあなたのマシンモデルで、次の__init__ようにチェックする方法だと思います:

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

どう見てもダサい。

シグナルの使用についてはどうですか?https://docs.djangoproject.com/en/dev/topics/signals

マシン レコードを作成すると、ドメイン レコードの作成がトリガーされます。また、ドメインの整数または文字列がドメインにある必要があるかどうかを確認します。

あなたの質問に答えるために、私の意見では、あなたはジャンゴイストの道を進んでいません。

于 2013-03-22T05:44:29.430 に答える