Ich möchte ein Objekt erstellen, das 2 Links zu Benutzern enthält. Beispielsweise:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
Beim Ausführen des Servers werden jedoch die folgenden Fehler angezeigt:
Der Accessor für das Feld 'Ziel' kollidiert mit dem zugehörigen Feld 'User.gameclaim_set'. Fügen Sie der Definition für 'Ziel' ein Argument für einen verwandten Namen hinzu.
Der Accessor für das Feld 'Claimer' kollidiert mit dem zugehörigen Feld 'User.gameclaim_set'. Fügen Sie der Definition für 'Anspruchsberechtigter' ein Argument für einen verwandten Namen hinzu.
Können Sie bitte erklären, warum ich die Fehler erhalte und wie ich sie beheben kann?
python
django
django-models
Oleg Tarasenko
quelle
quelle
related_name
in der Dokumentation] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) ansehen, wird erklärt, warum sie auftreten.Antworten:
Sie haben zwei Fremdschlüssel für den Benutzer. Django erstellt automatisch eine umgekehrte Beziehung vom Benutzer zurück zu GameClaim, was normalerweise der Fall ist
gameclaim_set
. Da Sie jedoch zwei FKs haben, würden Sie zweigameclaim_set
Attribute haben, was offensichtlich unmöglich ist. Sie müssen Django also mitteilen, welchen Namen er für die umgekehrte Beziehung verwenden soll.Verwenden Sie das
related_name
Attribut in der FK-Definition. z.Bquelle
Das
User
Modell versucht, zwei Felder mit demselben Namen zu erstellen, eines fürGameClaims
diejenigen, die dasUser
als das habentarget
, und eines fürGameClaims
diejenigen, die dasUser
als das habenclaimer
. Hier sind die Dokumente zurelated_name
Djangos Methode, mit der Sie die Namen der Attribute festlegen können, damit die automatisch generierten Attribute nicht in Konflikt geraten.quelle
Das OP verwendet keine abstrakte Basisklasse ... aber wenn Sie dies tun, werden Sie feststellen, dass eine harte Codierung des verwandten Namens in der FK (z. B. ... verwandter Name = "mein Name") zu einer Reihe dieser Konfliktfehler führt - eine für jede von der Basisklasse geerbte Klasse. Der unten angegebene Link enthält die Problemumgehung, die einfach, aber definitiv nicht offensichtlich ist.
Aus den Django-Dokumenten ...
Mehr Infos hier .
quelle
Manchmal müssen Sie zusätzliche Formatierungen verwenden
related_name
- eigentlich immer dann, wenn die Vererbung verwendet wird.Hier gibt es keinen Konflikt, aber related_name wird einmal definiert und Django kümmert sich um die Erstellung eindeutiger Beziehungsnamen.
In Kindern der Value-Klasse haben Sie dann Zugriff auf:
quelle
Dies scheint mir gelegentlich zu begegnen, wenn ich einem Django-Projekt ein Submodul als Anwendung hinzufüge, beispielsweise aufgrund der folgenden Struktur:
Wenn ich INSTALLED_APPS Folgendes hinzufüge:
Django scheint die Datei myapp.mymodule models.py zweimal zu verarbeiten und löst den obigen Fehler aus. Dies kann behoben werden, indem das Hauptmodul nicht in die Liste INSTALLED_APPS aufgenommen wird:
Das Einbeziehen von
myapp
anstelle vonmyapp.module
bewirkt, dass alle Datenbanktabellen mit falschen Namen erstellt werden. Dies scheint also der richtige Weg zu sein.Ich bin auf diesen Beitrag gestoßen, als ich nach einer Lösung für dieses Problem gesucht habe, also dachte ich mir, ich würde das hier einfügen :)
quelle
Wenn Sie nur zu Jordans Antwort hinzufügen (danke für den Tipp Jordan), kann dies auch passieren, wenn Sie die Ebene über den Apps importieren und dann die Apps importieren, z
myproject/ apps/ foo_app/ bar_app/
Wenn Sie also Apps, foo_app und bar_app importieren, kann dieses Problem auftreten. Ich hatte Apps, foo_app und bar_app alle in settings.INSTALLED_APPS aufgeführt
Und Sie möchten den Import von Apps sowieso vermeiden, da dann dieselbe App in zwei verschiedenen Namespaces installiert ist
apps.foo_app
undfoo_app
quelle