Django related_name для полевых столкновений
В моих моделях возникает столкновение полей:
class Visit(models.Model):
user = models.ForeignKey(User)
visitor = models.ForeignKey(User)
Error: One or more models did not validate:
profiles.visit: Accessor for field 'user' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'user'.
profiles.visit: Accessor for field 'visitor' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'visitor'.
что было бы разумным "related_field" для использования в поле посетителя? Эта модель в основном представляет собой посещения, которые конкретный профиль пользователя.
Также я должен заменить любой из ForeignKey на ManyToManyField? Логика немного запутанна.
Изменить:
Кажется, это исправить, но я не уверен, что это то, что я хочу.:)
class Visit(models.Model):
user = models.ForeignKey(User)
visitor = models.ForeignKey(User, related_name='visitors')
Ответы
Ответ 1
Если посещение является сильной концепцией в вашем приложении, то имеет смысл иметь его так, как вы определили: посещение состоит из "пользователя пользователя" и "посетителя пользователя".
Если, однако, посещение - это просто способ, которым пользователи связаны между собой, тогда, возможно, у вас должно быть отношение ManyToMany
между пользователями. Для этой цели вы, вероятно, должны использовать ManyToManyField.symmetrical в Профиль пользователя (в котором вы распространяете информацию, которая поставляется с auth.models.User
).
В любом случае, касаясь связанного_имя, вы можете отключить обратное отношение, если вы не будете получать доступ к посещениям пользователя, или используйте разумное имя, например visits_to_self
на user
и visits_to_others
на visitor
, что позволит увидеть, кто посетил пользователя, вызвав user.visits_to_self
и посетивший пользователя user.visits_to_others
.
Ответ 2
Когда у вас есть ForeignKey
, он создает свойство с именем модели плюс _set
с указанной моделью. Проблема здесь в том, что оба внешних ключа хотят создать свойство на User
с именем visit_set
. Решение состоит в том, чтобы добавить связанные имена, которые различны для каждого внешнего ключа.
Обычно я использую множественные числа для связанных имен. В таких случаях я добавляю предложение "как" к связанному имени:
class Visit(models.Model):
user = models.ForeignKey(User, related_name="visitsAsUser")
visitor = models.ForeignKey(User, related_name="visitsAsVisitor")
Вы не хотите использовать ManyToManyField
, если у вас не может быть ноль или больше посетителей за Visit
или пользователей за Visit
.