Подтвердить что ты не робот

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')
4b9b3361

Ответ 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.