Связанные имена предоставляются Django ORM, чтобы вы могли легко найти все модели, которые входят в текущую модель.Таким образом, если у вас есть ключ от Foo к Bar, экземпляр Bar по умолчанию будет иметь атрибут foo_set, который даст вам список всех Foo, связанных с этим конкретным Bar.
Вы можете указать свое собственное related_name, чтобы сделать ваш код более легким для чтения, с более естественными / подходящими related_names.
Однако, как вы видите, ORM в Django требует уникальных значений related_name, и потому что у вас есть FKв вашем базовом классе он автоматически создает эти FK для всех дочерних моделей и использует для них одно и то же имя, что, разумеется, нежизнеспособно.
Хорошая новость: эта заметка в документации показываетОбходной путь для Django 1.2 +
Если по какой-то причине вам придется использовать Django 1.1 или более раннюю версию, вот альтернативный обходной путь: вместо использования FK на абстрактной модели, просто используйте поле длясохраните ПК для модели с ключами и добавьте соответствующие методы доступа.например:
class AuditBase(models.Model):
created_at = models.DateTimeField("Created at", auto_now_add=True)
created_by = models.IntegerField(required=True)
updated_at = models.DateTimeField("Updated at", auto_now=True)
updated_by = models.IntegerField(required=True)
class Meta:
abstract = True
@property
def creator(self):
return User.objects.get(id=self.created_by)
@property
def last_editor(self):
return User.objects.get(id=self.updated_by)
def save(self, *args, **kwargs):
#track the creator/last editor via an optional kwarg
active_user = self.kwargs.get('user')
if active_user:
self.updated_by = active_user
if active_user and not self.created_by:
self.created_by = active_user
return super(AuditBase, self).save(*args, **kwargs)