Django syncdb конфликтует related_name при использовании наследования и ForeignKey - PullRequest
12 голосов
/ 25 апреля 2011

На этот раз я думаю, что я не глупый, а настоящий конфликт.У меня есть следующий код (упрощенно):

from django.db import models

class Alpha(models.Model):
    relation = models.ForeignKey('Delta', related_name = 'reverse_relation', blank = True, null = True)

    class Meta:
        abstract = True

class Beta(Alpha):
    pass

class Gamma(Alpha):
    pass

class Delta(models.Model):
    pass

Проблема в том, что Delta.reverse_relation может ссылаться на экземпляр Beta или экземпляр Gamma.Я бы как-то должен был предоставить несколько значений related_name (или того, которое зависит от имени класса). Я думаю, что проблема ясна, но чтобы быть полной, ошибка (при запуске syncdb): app.beta: Accessor для поля 'отношение' конфликтуетсо связанным полем «Delta.reverse_relation».Добавьте аргумент related_name к определению для «отношения».
app.beta: Обратное имя запроса для поля «отношение» конфликтует со связанным полем «Delta.reverse_relation».Добавьте аргумент related_name к определению для «отношения».
app.gamma: Accessor для поля «отношения» конфликтует со связанным полем «Delta.reverse_relation».Добавьте аргумент related_name к определению для «отношения».
app.gamma: Обратный запрос имени для поля «отношение» конфликтует со связанным полем «Delta.reverse_relation».Добавьте аргумент related_name к определению для «отношения».

Можно ли вообще поместить ForeignKey в родительскую альфу или это единственный способ вырезать и вставить этот код в бета и гамму?Я предпочитаю этого не делать, потому что это своего рода побеждает точку наследования, если я не могу определить в родительской половине поля, которые разделяют все дети.

Любая помощь очень ценится!

(Если кто-то может прокомментировать, почему сообщения об ошибках не находятся в поле кода, я это исправлю.)

1 Ответ

21 голосов
/ 02 августа 2011

Я думаю, что вы найдете следующие советы в документации Django полезными и актуальными: https://docs.djangoproject.com/en/1.7/topics/db/models/#be-careful-with-related-name

Существенно изменить объявление поля отношения на:

relation = models.ForeignKey('Delta', related_name="%(app_label)s_%(class)s")

Удачи ...

...