it-swarm.com.de

Django REST Feld für das Framework-Serialisierer erforderlich = false

aus der Dokumentation:

schreibgeschützt Setzen Sie diesen Wert auf "True", um sicherzustellen, dass das Feld beim Serialisieren einer Repräsentation verwendet wird, nicht jedoch beim Aktualisieren einer Instanz während der Deserialisierung.

Der Standardwert ist "False"

erforderlich Normalerweise wird ein Fehler ausgelöst, wenn während der Deserialisierung kein Feld bereitgestellt wird. Setzen Sie den Wert auf "false", wenn dieses Feld während der Deserialisierung nicht vorhanden sein muss.

Standardeinstellung ist "True".

Ich habe also ein Modell mit einem Feld, das nicht nullfähig ist, aber ich möchte, dass es in der pre_save-Methode gefüllt wird. Daher habe ich das Feld im Serializer auf required=False gesetzt, scheint aber nicht zu funktionieren. Beim Speichern des Datensatzes wird immer noch ein Fehler angezeigt.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

Update: Ich habe serializer_class = serializers.FavoriteListSerializer zum ViewSet hinzugefügt, jetzt anstelle von This field is required, was meiner Meinung nach die Validierung überstanden hat, aber dann bekomme ich This field cannot be null..

23
James Lin

Ja, ich bin auch irgendwann auf dieses Thema gestoßen. Sie müssen auch die Validierungsausschlüsse aktualisieren.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

    def get_validation_exclusions(self):
        exclusions = super(FavoriteListSerializer, self).get_validation_exclusions()
        return exclusions + ['owner']
33
Kevin Stone

Falls hier jemand mit einem ähnlichen Problem landet, achten Sie zusammen mit required auf die folgenden Attribute:

allow_blank

Wenn True eingestellt ist, sollte der leere String als gültiger Wert betrachtet werden.

allow_null :

Normalerweise wird ein Fehler ausgelöst, wenn None an ein Serialisiererfeld übergeben wird.

erforderlich :

Normalerweise wird ein Fehler ausgelöst, wenn während der Deserialisierung kein Feld bereitgestellt wird.

Ich wollte nicht herausfinden, warum ich mit required=False einen Validierungsfehler erhielt, bei dem ich das allow_null-Attribut verfehlt hatte.

10
Wtower

Späterer Einstieg in diesen Thread. Dieses Problem wurde in Django-rest-framework 2.3.13 behoben. Hier ist der Link von PR .

3
Pankaj Singhal

Ich nehme an, die Methode .get_validation_exclusions () wird jetzt entfernt. Ich habe es nicht in ModelSerializer doc gefunden und es wurde nach dem Überschreiben nicht ausgeführt (djangorestframework == 3.8.2). Und ich bin nicht der einzige, der sich diesem Problem stellt .

Meine Lösung ist, einfach einen Standardwert für ein Feld hinzuzufügen, das ich nicht benötigt haben möchte. Es sollte speziell für Situationen mit pre_save geeignet sein:

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(default='')
    class Meta:
        model = models.FavoriteList

Sie müssen auch bedenken, dass die Verwendung von drf-Serialisierern mit pre_save-Signalen implizites Verhalten verursachen kann (ich habe das nicht überprüft, aber es scheint logisch zu sein):

pre_save wird beim Speichern von Objekten vor dem Speichern (unglaublich) aufgerufen, was (wahrscheinlich) nach der Validierung des Serializers bedeutet.

0
validname