python matplotlib - Django:Warum kollidieren einige Modellfelder miteinander?




example install (7)

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?


Answers

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 .


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

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.


Manchmal müssen Sie zusätzliche Formatierung in related_name - eigentlich immer dann, wenn die Vererbung verwendet wird.

class Value(models.Model):
    value = models.DecimalField(decimal_places=2, max_digits=5)
    animal = models.ForeignKey(
        Animal, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

class Height(Value):
    pass

class Weigth(Value):
    pass

class Length(Value):
    pass

Kein Konflikt hier, aber related_name ist einmal definiert und Django kümmert sich darum, eindeutige Beziehungsnamen zu erstellen.

In Children der Value-Klasse haben Sie Zugriff auf:

herdboard_height_related
herdboard_lenght_related
herdboard_weight_related

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.


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.


Tun Sie einfach, was die Fehlermeldung Ihnen sagt, und wenn Sie nicht sicher sind, was das bedeutet, konsultieren Sie die Dokumentation für related_name .







python django django-models