Как разработать модель для моего случая с Django? - PullRequest
1 голос
/ 02 октября 2009

Вот две роли: тренер и стажер. Тренер может иметь несколько стажеров. В то время как у каждого стажера может быть только один тренер или нет тренера.

Вот моя модель:

class TrainerShip(models.Model):
    trainer = models.ForeignKey('Trainer')
    trainee = models.ForeignKey(User)
    request_date = models.DateTimeField(auto_now_add=True)
    accept_date = models.DateTimeField(auto_now_add=True)
    expiration_date = models.DateTimeField(auto_now_add=True)

class Trainer(models.Model):
    user = models.ForeignKey(User, unique=True)
    trainee = models.ManyToManyField(User, through=TrainerShip)
    introduction = models.TextField(max_length=500)
    certification = models.TextField(max_length=300)
    specialties = models.TextField(max_length=300)
    contact = models.TextField(max_length=100)
    active = models.BooleanField(default=False)

Я получаю следующую ошибку при попытке создать БД:

shen @ shen-laptop: ~ / django / sutifang $ ./manage.py syncdb Ошибка: одна или несколько моделей не прошли проверку: registration.trainer: аксессор для поля 'user' конфликтует с соответствующим полем m2m 'User.trainer_set'. Добавьте аргумент related_name в определение для 'user'. registration.trainer: Accessor для m2m поля 'стажер' конфликтует со связанным полем 'User.trainer_set'. Добавьте аргумент related_name к определению «стажер».

У кого-нибудь есть идея решить эту проблему? Есть ли лучший способ смоделировать такие отношения?

1 Ответ

3 голосов
/ 02 октября 2009

Проблема в том, что внешний ключ установил двустороннюю связь. Это означает, что вы можете использовать User.trainer_set, чтобы получить все модели Trainer под пользователем, что означает, что у вас есть круговая ссылка на базу данных пользователей (получение моделей Trainer возвращает все ее поля, одно из которых является исходным пользователем модель.

Итак, чтобы исправить это, добавьте связанный аргумент имени во внешний ключ, чтобы остановить эту циклическую зависимость:

user = models.ForeignKey(User, unique=True, related_name='traineruser')

Вы можете заменить traineruser чем-то, что еще не имеет таблицы в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...