Benutzerdefiniertes Django-Foreignfield

6

Jeder weiß, wie man ein Fremdschlüsselfeld erstellt und es immer auf dasselbe Modell zeigt, bis jetzt habe ich diese.

%Vor%

Aber ich habe Fehler beim Start. Ich ziele darauf ab, es zu benutzen,

%Vor%

Keine weiteren Erklärungen erforderlich.

Bearbeiten: Ich will das, weil ich diesen Fremdschlüssel in Ruhe an einigen Stellen habe. Wenn ich den Verbose_name des Feldes ändern möchte, möchte ich, dass alle meine Felder von dieser Änderung betroffen sind. Der ausführliche Name war ein Beispiel, möglicherweise ein anderes Attribut.

Ich möchte auch nicht die Einstellungen py verwenden, um die Standardwerte zu deklarieren.

    
durdenk 29.06.2017, 23:17
quelle

5 Antworten

7

Ich empfehle, dass Sie nur eine einfache Funktion verwenden, um eine ähnlich vorkonfigurierte Instanz von ForeignKey zu erstellen: (keine Instanz der Unterklasse von ForeignKey)

%Vor%

Das related_name -Attribut ist ein Name, der für die Rückwärtsbeziehung vom Zielobjekt othermodel zu allen Objekten verwendet wird, die darauf verweisen. Dieser Name muss in anderen Modellen eindeutig sein ('panbas.PanBasTimeUnit', normalerweise etwas mit einem eindeutigen App- und Klassennamen), oder dieser Name kann '+' sein, wenn Sie keine Rückwärtsbeziehungsabfrage erstellen möchten. Beide Varianten sind im Beispiel enthalten. Merken Sie sich auch on_delete .

Wenn Sie wirklich eine Unterklasse erstellen müssten (was sinnvoll ist, wenn mehr Methoden angepasst werden müssen), müssen Sie auch eine deconstruct -Methode für Migrationen definieren. Es wäre kompliziert, wenn Sie diese Unterklasse später ändern müssten. Es kann nie entfernt, umbenannt usw. werden, weil Migrationen auf ein benutzerdefiniertes Feld . Auf der anderen Seite, wenn Sie eine einfache Instanz von ForeignKey direkt von einer Funktion erstellen, können alle über Migrationen ignoriert werden.

BEARBEITEN

Alternativ können Sie eine abstrakte Basis erstellen modellieren mit diesem Feld und erstellen neue Modelle durch Vererbung oder Mehrfachvererbung :

%Vor%

Diese Lösung (inspiriert von einer ungültigen Soution Ykh) ist nützlich, wenn Sie eine Methode zu Modellen mit diesem Feld hinzufügen oder mehrere Felder zusammenfügen möchten, da sonst die ursprüngliche Lösung einfacher ist.

    
hynekcer 05.07.2017, 22:16
quelle
6
%Vor%

Verwenden Sie 'self' oder 'panbas.PanBasTimeUnit' wird gut.

    
Ykh 30.06.2017 00:11
quelle
4

Sie können nicht mehrere Fremdschlüssel für ein Modell mit demselben related_name .

In der Instanz PanBasTimeUnit , welchen Manager sollte Django zurückgeben, wenn er <instance>.machine_unit aufruft? Deshalb müssen Sie auf verwandte Modelle und abstrakte Klassen .

Es sollte gut funktionieren, wenn Sie kwargs['related_name'] = 'machine_unit' in Ihrem Code entfernen und durch kwargs['related_name'] = "%(app_label)s_%(class)s_related" oder etwas ähnliches ersetzen.

    
Michael Rigoni 03.07.2017 09:09
quelle
3

Eine leichte Änderung in Ihrem Versuch sollte Ihre Arbeit erledigen.

%Vor%     
Raj Subit 02.07.2017 02:45
quelle
1

Warum nicht direkt machine_unit = models.ForeignKey(panbas.PanBasTimeUnit, verbose_name=_('Machine Unit'), related_name='machine_unit')) ?

verwenden?     
Yom86 30.06.2017 00:12
quelle

Tags und Links