Вы в разделе "Я c Django"

Раздел разработан на базе материала Evgenii Legotckoi автора сайта= EVILEG

  • Статья ForeignKey

    Автор - zabariap

    Из подраздела - Код

    Создавая модели  для разных приложений в проекте необходимо было связать поле с одной моделью посредством ForeignKey

     user = models.ForeignKey(to=User, verbose_name='Пользователь', on_delete=models.CASCADE, blank=True, null=True)

    но при выполнение миграций получал ошибку (код fields.E304)

    Причина ошибки из-за не понимания механизма  ForeignKey.

    Эта ошибка (кодfields.E304) возникает в Django, когда две разные связи (через ForeignKey) пытаются создать на одной модели обратный аксессор с одним и тем же именем. В вашем случае обе связи (arduino.Rating.user и project.Rating.user) по умолчанию пытаются породить обратный аксессор rating_setна модели User, и Django не может разрешить этот конфликт. 

    Хотя по моему пониманию должна была быть привязка поля   user к модели User, но скорее всего раз есть обратная связь, чтобы в случае удаления юзера удалялись связи во связных моделях.

     Как решить проблему

    Чтобы устранить конфликт, нужно явно задать для каждого ForeignKey уникальное значение параметраrelated_name. Это скажет Django, какое имя использовать для обратного аксессора, и разрешит неоднозначность. pythontutorials.net

    Пример решения:

    Измените определение поля в одной из моделей (например, вproject/models.py):

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='projekt_ratings')

    А в другой модели (например, вarduino/models.py) оставьте без изменения:

    user = models.ForeignKey(User, on_delete=models.CASCADE)  # related_name будет 'arduino_ratings' по умолчанию

    Теперь у пользователя будут два разных атрибута для доступа к связанным объектам:projekt_ratingsиarduino_ratings.


    Теги записи: ForeignKey, cdzpb,
  • Комментарии

    Нет комментариев

    Форма добавления комментария доступна только авторизованному пользователю.
    Для неавторизованных пользователей доступно только чтение материалов.

    Информация

    Ключевые слова