Chcę utworzyć obiekt zawierający 2 linki do użytkowników. Na przykład:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
ale otrzymuję następujące błędy podczas uruchamiania serwera:
Akcesor dla pola „target” koliduje z polem pokrewnym „User.gameclaim_set”. Dodaj argument related_name do definicji „celu”.
Akcesor dla pola „wnioskodawca” koliduje z pokrewnym polem „User.gameclaim_set”. Dodaj argument related_name do definicji „wnioskodawcy”.
Czy możesz wyjaśnić, dlaczego otrzymuję błędy i jak je naprawić?
python
django
django-models
Oleg Tarasenko
źródło
źródło
related_name
w dokumentacji] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) wyjaśni, dlaczego się pojawiają.Odpowiedzi:
Masz dwa klucze obce dla użytkownika. Django automatycznie tworzy odwrotną relację z User z powrotem do GameClaim, co zwykle jest
gameclaim_set
. Jednakże, ponieważ masz dwa FK, miałbyś dwagameclaim_set
atrybuty, co jest oczywiście niemożliwe. Musisz więc powiedzieć Django, jakiej nazwy użyć dla relacji odwrotnej.Użyj
related_name
atrybutu w definicji FK. na przykładźródło
User
Modelu próbuje utworzyć dwa pola o tej samej nazwie, po jednym dlaGameClaims
że ma toUser
jaktarget
, a inna dlaGameClaims
że ma toUser
jakclaimer
. Oto dokumentacjarelated_name
, czyli sposób, w jaki Django pozwala ci ustawić nazwy atrybutów, aby te wygenerowane automatycznie nie powodowały konfliktów.źródło
OP nie używa abstrakcyjnej klasy bazowej ... ale jeśli tak, przekonasz się, że na stałe zakodowanie powiązanej_nazwy w FK (np. ..., nazwa_powiązanej = "moja_nazwa") spowoduje szereg takich błędów konfliktu - po jednym dla każdej klasy odziedziczonej z klasy bazowej. Poniższy link zawiera obejście, które jest proste, ale zdecydowanie nieoczywiste.
Z dokumentacji django ...
Więcej informacji tutaj .
źródło
Czasami musisz użyć dodatkowego formatowania
related_name
- właściwie zawsze, gdy używane jest dziedziczenie.Nie ma tu konfliktu, ale related_name jest zdefiniowane raz i Django zajmie się tworzeniem unikalnych nazw relacji.
wtedy w dzieciach klasy Value będziesz mieć dostęp do:
źródło
Wydaje się, że spotykam się z tym czasami, gdy dodaję podmoduł jako aplikację do projektu django, na przykład biorąc pod uwagę następującą strukturę:
Jeśli dodam następujące elementy do INSTALLED_APPS:
Django wydaje się dwukrotnie przetwarzać plik myapp.mymodule models.py i zgłasza powyższy błąd. Można to rozwiązać, nie umieszczając głównego modułu na liście INSTALLED_APPS:
Włączenie opcji
myapp
zamiastmyapp.module
powoduje, że wszystkie tabele bazy danych zostaną utworzone z niepoprawnymi nazwami, więc wydaje się, że jest to właściwy sposób zrobienia tego.Natknąłem się na ten post, szukając rozwiązania tego problemu, więc pomyślałem, że wstawię to tutaj :)
źródło
Po prostu dodając do odpowiedzi Jordana (dzięki za wskazówkę Jordan) może się to również zdarzyć, jeśli zaimportujesz poziom powyżej aplikacji, a następnie zaimportujesz aplikacje, np.
myproject/ apps/ foo_app/ bar_app/
Więc jeśli importujesz aplikacje, foo_app i bar_app, możesz napotkać ten problem. Miałem aplikacje, foo_app i bar_app wszystkie wymienione w ustawieniach.INSTALLED_APPS
I tak chcesz uniknąć importowania aplikacji, ponieważ masz wtedy tę samą aplikację zainstalowaną w 2 różnych przestrzeniach nazw
apps.foo_app
ifoo_app
źródło