Django-Modelle - mindestens eins in vielen zu vielen

8

Wie kann ich sicherstellen, dass mindestens eine Viele-zu-viele-Beziehung festgelegt ist?

Zum Beispiel: Wenn ich ein listing -Modell mit einem image -Feld mit einer vielen zu vielen Beziehung zu images habe. Wie kann ich sicherstellen, dass mindestens ein Bild festgelegt ist

Bonusfrage: Was wäre, wenn das Minimum etwas anderes wäre als eins? Was ist mit einem Maximum?

    
RS7 07.03.2012, 00:04
quelle

1 Antwort

3

Sie können eine Funktion implementieren, um zu überprüfen, ob die Listing -Instanz mindestens eine Bildinstanz hat, und diese Funktion mit dem Listing -Modell verbinden. Signal pre_save

Es wird etwas wie sein (vorausgesetzt, Sie verwenden django 1.3)

%Vor%

Hier müssen Sie Ihre eigene_Ausnahme implementieren

Der folgende Zusatz ist die Antwort auf die weiteren Fragen von PO

Die Implementierung von Listing.clean() ist eine weitere Möglichkeit, dieselbe Validierungsregel zu erreichen. In der Tat ist dies der semantisch korrekte Ansatz, da Model.clean() für benutzerdefinierte Modellvalidierungen gedacht ist. Die Verwendung dieses Ansatzes wäre jedoch weniger praktisch - zum Auslösen des clean() müssten Sie entweder full_clean() manuell aufrufen (wenn Sie kein Modellformular verwenden) oder is_valid() (bei Verwendung des Modellformulars) manuell aufrufen, richtig vor dem Aufruf von save() einer Listing-Instanz. Referenz

Andererseits können Sie bei der Methode pre_save signal sicherstellen, dass die Validierungsregel immer auf Listing instance angewendet wird, wenn Sie save() für die Instanz aufrufen.

Es ist nicht richtig oder falsch, eine über die andere zu wählen, sondern lediglich eine Designentscheidung zu treffen. Mit beiden Ansätzen können Sie erreichen, was Sie benötigen, und die Geschäfts- / Domänenlogik (dh Ihre Validierungsregel) in der Modellebene beibehalten.

    
tamakisquare 07.03.2012, 01:16
quelle