Django-Modelle: Warum kollidieren die Namen?

7

Erstens, ich weiß, wie ich das Problem beheben kann, ich versuche nur zu verstehen, warum es passiert. Die Fehlermeldung:

  

users.profile: Der Name der umgekehrten Abfrage für das Feld 'Adresse' kollidiert mit dem verwandten Feld 'Address.profile'. Fügen Sie einen verwandten Namen hinzu a   der Definition für 'Adresse'.

Und der Code:

%Vor%

Wenn ich richtig verstehe, diese Zeile:

%Vor%

Veranlasst das Hinzufügen eines Attributs zur Klasse Address mit dem Namen profile . Was erstellt den anderen "Profil" Namen?

Was, wenn ich keinen umgekehrten Namen brauche? Gibt es eine Möglichkeit, es zu deaktivieren? Adressen werden für ein Dutzend Dinge verwendet, so dass die meisten umgekehrten Beziehungen sowieso leer sind.

Gibt es eine Möglichkeit, die Adressfelder in das Modell zu kopieren, anstatt eine separate Tabelle für Adressen zu haben? Ohne Python-Vererbung (das macht keinen Sinn, und wenn ein Model 2 Adressen hat, funktioniert es nicht).

    
mpen 07.02.2010, 20:08
quelle

3 Antworten

24

django docs heißt es :

Wenn Sie möchten, dass Django keine Rückwärtsbeziehung erstellt, setzen Sie related_name auf '+'. Dies stellt beispielsweise sicher, dass das Benutzermodell keine umgekehrte Beziehung zu diesem Modell erhält:

%Vor%

aber ich habe es nie selbst ausprobiert ....

    
adalovelace 19.01.2011, 11:34
quelle
1

Ich bin mir nicht sicher, woher das fehlgeleitete profile -Feld kommt ... Aber ein Weg, es herauszufinden, wäre: vorübergehend address = models.ForeignKey(…) vom Profil entfernen, ./manage.py shell , from ... import Address und dann sehen, was Address.profile macht sag es dir.

Ich glaube nicht, dass es einen offiziellen Weg gibt, nur die Felder von einem anderen Modell zu übernehmen, ohne Vererbung zu verwenden ... Aber Sie könnten es so vortäuschen (wo SourceModel ist, zB Address und TargetModel ist) zB Profile ):

%Vor%

(kommt von Djangos ModelBase __new__ Implementierung )

    
David Wolever 07.02.2010 22:37
quelle
0

Ich glaube nicht, dass es möglich ist, den umgekehrten Namen zu deaktivieren.

Ich habe gerade eine schnelle grep über den Code gemacht, und es sieht nicht so aus, als gäbe es keine Logik, die das Einrichten des Feldes related_name im zugehörigen Modell umgehen würde.

    
David Wolever 07.02.2010 22:43
quelle

Tags und Links