У django более 1 ошибки внешнего ключа - PullRequest
1 голос
/ 15 марта 2012

Мой файл моделей работает просто отлично. Как только я заменяю каждую модель. Модель на MyModel (дочерний класс моделей. Модель), одна из моих моделей поднимает

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

исключение. Единственное, что я делаю в дочернем классе, это переопределение метода clean.

Что я могу делать не так?

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):
...

Может быть полезно отметить, что Story является подклассом ManagedItem (подкласс MyModel).

1 Ответ

4 голосов
/ 15 марта 2012

Вам необходимо объявить MyModel (и, вероятно, ManagedItem) как абстрактную модель в своем классе Meta, в противном случае Django создаст для них отдельную таблицу и определит FK между ними.

class MyModel(SansHashUrl, models.Model):
    class Meta:
        abstract = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...