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.
.
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']
Falls hier jemand mit einem ähnlichen Problem landet, achten Sie zusammen mit required
auf die folgenden Attribute:
Wenn
True
eingestellt ist, sollte der leere String als gültiger Wert betrachtet werden.
Normalerweise wird ein Fehler ausgelöst, wenn
None
an ein Serialisiererfeld übergeben wird.
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.
Späterer Einstieg in diesen Thread. Dieses Problem wurde in Django-rest-framework 2.3.13 behoben. Hier ist der Link von PR .
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.