django related_name для полевых столкновений - PullRequest
18 голосов
/ 11 января 2011

Я получаю конфликт полей в моих моделях:

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

Ответы [ 2 ]

30 голосов
/ 11 января 2011

Если у вас есть ForeignKey, он создает свойство с именем модели плюс _set к указанной модели. Проблема в том, что оба внешних ключа хотят создать свойство на User с именем visit_set. Решение состоит в том, чтобы добавить связанные имена, которые различны для каждого внешнего ключа.

Обычно я использую множественное число для родственных имен. В подобных случаях я добавляю предложение «as» к связанному имени:

class Visit(models.Model):
     user = models.ForeignKey(User, related_name="visitsAsUser")
     visitor = models.ForeignKey(User, related_name="visitsAsVisitor")

Вам не нужен ManyToManyField, если вы не можете иметь ноль или более посетителей на Visit или пользователей на Visit.

9 голосов
/ 11 января 2011

Если посещение является сильной концепцией в вашем приложении, то, возможно, имеет смысл использовать его так, как вы определили: посещение состоит из «пользователя-пользователя» и «посетителя-пользователя».

Если, однако, посещение - это просто способ, которым пользователи связаны между собой, то, возможно, вы должны иметь отношение ManyToMany между пользователи .Для этой цели вам, вероятно, следует использовать ManyToManyField.symmetrical в профиле пользователя (в котором вы расширяете информацию, поставляемую с auth.models.User).

В любом случаеЧто касается related_name, вы можете либо отключить обратное отношение , если у вас нет доступа к посещениям от пользователя , либо использовать подходящее имя, такое какvisits_to_self в user и visits_to_others в visitor, что позволит увидеть, кто посетил пользователя, позвонив по номеру user.visits_to_self, и кто посетил пользователя по user.visits_to_others.

...