example - python plotting libraries




Django: Warum kollidieren einige Modellfelder miteinander? (5)

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

aber beim Ausführen des Servers erhalte ich folgende Fehler:

  • Accessor für das Feld 'Ziel' kollidiert mit dem verwandten Feld 'User.gameclaim_set'. Fügen Sie der Definition für 'Ziel' ein Argument related_name hinzu.

  • Accessor für das Feld 'Claimant' kollidiert mit dem verwandten Feld 'User.gameclaim_set'. Fügen Sie der Definition für "Claim" ein Argument related_name hinzu.

Kannst du mir bitte erklären, warum ich die Fehler bekomme und wie ich sie behebe?


Das User versucht, zwei Felder mit demselben Namen zu erstellen, eines für die GameClaims , die diesen User als target , und ein anderes für die GameClaims , die diesen User als den claimer . Hier ist die Dokumentation zu related_name , mit der Django die Namen der Attribute so related_name , dass die related_name nicht in Konflikt stehen.


Das OP verwendet keine abstrakte Basisklasse ... aber wenn Sie es sind, werden Sie feststellen, dass eine harte Codierung des related_name im FK (zB ..., related_name = "myname") zu einer Anzahl dieser Konfliktfehler führt - eine für jede geerbte Klasse aus der Basisklasse. Der unten angegebene Link enthält die Problemumgehung, die einfach, aber nicht offensichtlich ist.

Aus den Django-Dokumenten ...

Wenn Sie das Attribut related_name für einen ForeignKey oder ManyToManyField verwenden, müssen Sie immer einen eindeutigen umgekehrten Namen für das Feld angeben. Dies würde normalerweise ein Problem in abstrakten Basisklassen verursachen, da die Felder in dieser Klasse in jeder der untergeordneten Klassen enthalten sind, wobei jedes Mal genau die gleichen Werte für die Attribute (einschließlich related_name) vorhanden sind.

Mehr Infos hier .


Ich hatte das gleiche Problem. Mit Run Python manage.py makemigrations "appname" repariert es für mich. Ich habe versehentlich einige Migrationsdateien gelöscht. Keine Notwendigkeit, Dateien erneut zu löschen.


Ich stoße gelegentlich darauf, wenn ich ein Submodul als Anwendung einem Django-Projekt hinzufüge, zum Beispiel mit folgender Struktur:

myapp/
myapp/module/
myapp/module/models.py

Wenn ich Folgendes zu INSTALLED_APPS hinzufüge:

'myapp',
'myapp.module',

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:

'myapp.module',

myapp anstelle von myapp.module alle Datenbanktabellen mit falschen Namen erstellt. Dies scheint die richtige Vorgehensweise zu sein.

Ich bin auf diesen Beitrag gestoßen, als ich nach einer Lösung für dieses Problem gesucht habe.


Sie haben zwei Fremdschlüssel für Benutzer. Django erstellt automatisch eine umgekehrte Beziehung von User zurück zu GameClaim, was normalerweise gameclaim_set . Da Sie jedoch zwei FKs haben, hätten Sie zwei Attribute von gameclaim_set , was offensichtlich nicht möglich ist. Also müssen Sie Django mitteilen, welcher Name für die umgekehrte Beziehung verwendet werden soll.

Verwenden Sie das Attribut related_name in der FK-Definition. z.B

class GameClaim(models.Model):
    target = models.ForeignKey(User, related_name='gameclaim_targets')
    claimer = models.ForeignKey(User, related_name='gameclaim_users')
    isAccepted = models.BooleanField()




django-models