Django syncdb конфликтует связанное имя при использовании наследования и ForeignKey
На этот раз я думаю, что это не я, будучи глупым, но реальным конфликтом. У меня есть следующий код (упрощенный):
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. Я должен каким-то образом предоставить несколько значений связанных имен (или тот, который зависит от имени класса). Я думаю, что проблема ясна, но должна быть полной, ошибка (при запуске syncdb): app.beta: Аксессуар для связей "отношения" поля со связанным полем "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 в родительском Alpha или это единственный способ вырезать этот код для бета-версии и гаммы? Я предпочитаю не делать этого, потому что это как бы поражает точку наследования, если я не могу определить в родительской половине поля, которые разделяют все дети.
Любая помощь очень искушена!
(Если кто-нибудь может прокомментировать, почему сообщения об ошибках не указаны в поле кода, я исправлю это.)
Ответы
Ответ 1
Я думаю, что вы найдете следующий совет в документации 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")
Удачи...