Gibt es ein Modell MultiField (eine Möglichkeit, DB-Modelle Fields in Django zu komponieren)? Oder warum wäre das kein sinnvolles Konzept?

Wenn wir eine Django-Anwendung erstellt haben, waren wir (Formularen) ausgesetztMultiValueField undMultiWidget.

Sie scheinen ein interessanter Ansatz zu sein, um ihre jeweiligen Basisklassen zusammenzustellen und mehr Modularität zu erreichen.

Yet, jetzt scheint es uns, dass das eigentliche Stück, das diese beiden zum Leuchten bringen würde, ein @ wärdb.models.MultiField. Hier ist die Begründung:

Es scheint, dass Django bei Verwendung einer ModelForm eine strikte 1: 1-Zuordnung zwischen einem model.Field und einem forms.Field erzwingt. Jetzt mitforms.MultiValueField, trotz dieser strengen 1-zu-1-Zuordnung können Sie ein einzelnes @ habmodels.Field tatsächlich mit den zahlreichen @ verbundforms.Field komponiere dasforms.MultiValueField.

Yet, es ist auf den Fall beschränkt, in dem ein einzelnesmodels.Field ordnet natürlicher mehreren @ forms.Field. Was sehr interessant erscheint, ist die Möglichkeit, eine beliebige Anzahl von @ zuzuordnemodels.Fields Auf eine beliebige Anzahl vonforms.Field. Dasnu Stück, das zu fehlen scheint, um dorthin zu gelangen, ist eine hypothetischemodels.MultiField. Es könnte mit dem Äußeren durch ein @ kommuniziercompress() Methode (siehe.MultiValueField) und möglicherweise eindecompress() Methode in die andere Richtung (sieheMultiWidget).

Die Fragen wären dann (vorausgesetzt, diese Anforderung ergibt sich nicht aus einem Missverständnis von Django): Gibt es eine Möglichkeit, @ zu komponieremodelds.Field in Django? Wenn nein, warum wird ein solches Empowering-Konzept in diesem großartigen Rahmen nicht umgesetz

BEARBEITEN Um ein motivierendes Beispiel zu geben, stellen Sie sich vor, wir möchten ein @ implementierepartial date (ein Datum, das auf einen Tag genau sein kann, oder nur auf einen Monat und ein Jahr genau, oder alternativ nur auf ein Jahr), mit einemModel folgenddie in dieser Antwort präsentierte, d.

a DateField, repräsentiert das Datuma CharField, um anzugeben, ob das Datum @ iKomplet oderMonat + Jahr oderjust year.

Dieses Modell funktioniert einwandfrei mit der StandardeinstellungModelForm, aber jetzt wollen wir eine Konsistenzprüfung einführen: Wenn ein Datum nur auf den Monat genau ist Monat + Jahr oderjust year), sein Tag sollte @ se1, und wenn es nur auf das Jahr genau ist, sollte sein Monatsteil auch @ se1.

Das ist ein cross-fields check (zwei verschiedeneFields vomModelForm muss aufgerufen werden, um es zu vervollständigen), also muss es am @ implementiert werdForm.clean() Niveau. Diese Prüfung müsste in jedem Formular mit einem Teildatum kopiert werden, was gegen den von Django geschätzten DRY verstößt.

Jetzt stellen wir uns vor, Django liefert dieses hypothetischemodels.MultiField, das wäre ein zusammengesetztesmodels.Field. Wir könnten ein @ definierPartialDateclass abgeleitet vonMultiField und enthält die beiden oben definierten Blattfelder DateField undCharField). Wir könnten jetzt sagen, dass dasbilde Feld, das diesem @ entspricSingl Model Feld (in einemModelForm) ist eine Klasse abgeleitet vonforms.MultiValueField. Diese Klasse Konnte die Konsistenzprüfung implementieren oben, amFeldebene: es ist keine feldübergreifende Prüfung mehr.

Auf diese Weise haben wir die Code-Duplizierung beseitigt: Jedes Modell könnte ein @ verwendePartialDate -Feld, macht automatisch einModelForms Zuordnung dazu verwenden Sie dieforms.MultiValueField Implementierung der Konsistenzprüfung, deren Code nur an einer Stelle geschrieben wurde.

(Dies ist ein einfaches Beispiel. Man kann sich leicht vorstellen, dass es im Produktionscode sehr viel komplexer wird. Mit der Konsistenzprüfung möchten Sie das Einfügen nicht kopieren.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage