1

私のモデルファイルは正常に動作します。できるだけ早く私はmymodelという持つすべてのmodels.Model(models.Modelの子クラス)に置き換えると、私のモデルの一つは、djangoに2つ以上の外部キーエラーがあります

<class 'puppy.cms.models.Appearance'> has more than 1 ForeignKey to <class 'puppy.cms.models.Segment'> 

例外が発生します。子クラスで唯一行っていることは、クリーンメソッドをオーバーライドすることです。

私は間違っていますか?エラーをスロー

class SansHashUrl(object): 
    """ Upon each call to clean, iterates over every field, 
    and deletes all '#/' and '#!/' occurances. 
    IMPORTANT: This mixin must be listed first in the inheritance list to work 
    properly. """ 

    def clean(self): 

     attrs = (field.attname for field in self.__class__._meta.fields 
           if isinstance(field, models.CharField) 
           or isinstance(field, models.TextField)) 

     for attr in attrs: 
      attr_value = self.__getattribute__(attr) 
      tokens = attr_value.split() 
      for i, token in enumerate(tokens): 
       if has_internal_domain(token): 
        suggested_url = re.sub('#!?/','', token) 
        tokens[i] = suggested_url 
      self.__setattr__(attr, ' '.join(tokens)) 

class MyModel(SansHashUrl, models.Model): 
    pass 

モデル:基準で

class Appearance(MyModel): 

    appearance_type = models.CharField(max_length=20, 
             choices=APPEARANCE_TYPE_CHOICES) 
    person = models.ForeignKey(Person, related_name='person_appearance') 
    item = models.ForeignKey(ManagedItem) 

    class Meta: 
     unique_together = (('person', 'item'),) 

    def __unicode__(self): 
     return self.person.__unicode__() 

に:

class Segment(Story, HasStatsTags, HasFullUrl): 
... 

ストーリーManagedItem(mymodelというのサブクラス)のサブクラスであることに留意することが有用かもしれません。

+0

本当に各属性を繰り返し処理しますか?なぜこれをカスタムフィールドにしないのですか?あなたの外来のキー/整数フィールドの上でこれを実行するのは本当に意味がありません... – sdolan

答えて

4

Metaクラスの抽象モデルとしてMyModel(おそらくはManagedItem)を宣言する必要があります。それ以外の場合、Djangoは別のテーブルを作成し、それらの間にFKを定義します。

class MyModel(SansHashUrl, models.Model): 
    class Meta: 
     abstract = True 
+0

ああ愚かな私!ありがとう! – TheOne