2011-01-11 9 views
18

jestem coraz starcia pola w moich modelach:Django related_name na polu ściera

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

co byłoby sensowne „related_field” do wykorzystania na polu zwiedzających? Ten model zasadniczo reprezentuje wizyty, które odbywają się w profilu konkretnego użytkownika określonego w .

Czy powinienem również wymienić dowolny z kluczy ForeignKey na ManyToManyField? Logika jest trochę zagmatwana.

Edytuj: To wydaje się naprawić, ale nie jestem pewien, czy to jest to, co chcę. :)

class Visit(models.Model): 
     user = models.ForeignKey(User) 
     visitor = models.ForeignKey(User, related_name='visitors') 

Odpowiedz

9

Jeśli wizyta silna koncepcja w aplikacji, to może mieć sens, aby to sposób zdefiniowany: wizyta składa się z użytkownikiem użytkownika „” i „” odwiedzającego użytkownika.

Jeśli jednak wizyta jest tylko sposób, w jaki użytkownicyodnoszą się między sobą, to być może trzeba mieć ManyToMany relację między użytkowników. W tym celu powinieneś prawdopodobnie użyć ManyToManyField.symmetrical w User Profile (w którym rozszerzasz informacje, które pochodzą z auth.models.User).

W każdym razie, jeśli chodzi o related_name, możesz albo disable the backwards relation jeśli nie będzie dostępu do razy z użytkownik lub użyj sensownej nazwy takie jak visits_to_self na user i visits_to_others na visitor, które zobacz, kto odwiedził użytkownika dzwoniąc pod numer user.visits_to_self i kto odwiedził go przez user.visits_to_others.

28

Kiedy masz ForeignKey tworzy właściwość o nazwie z nazwą modelu oraz _set do odwołania modelu. Problem polega na tym, że oba klucze obce chcą utworzyć właściwość pod numerem User o nazwie visit_set. Rozwiązaniem jest dodanie powiązanych nazw, które są różne dla każdego klucza obcego.

Zazwyczaj używam form liczby mnogiej dla nazw pokrewnych. W takich przypadkach, dodam „AS” klauzuli nazwy związane:

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

Nie chcą ManyToManyField chyba można mieć zero lub więcej odwiedzających na Visit lub użytkowników za Visit.

+5

Aby być pedantycznym, lepiej byłoby stosować się do konwencji nazewnictwa Django. A zatem '" visitAsUser "' byłoby czymś w stylu '' odwiedzający_użytkownik "'. Osobiście wolałbym '" user_visits "', ale to tylko osobiste preferencje. – Johndt6

+0

Przestrzeganie konwencji Django sprawia, że ​​rzeczy w administracji wyglądają śmiesznie. Ale miałem dużo kodu, który korzystał z konwencji wielbłąda w tym czasie, więc nawyk przejął kontrolę. –

+1

Pomyślałem, że warto o tym wspomnieć :) Konwencje nazewnictwa ułatwiają nie tylko odbiorcom, ale i autorom czytanie kodu. – Johndt6