J'ai le sérialiseur suivant:
... track_group = TrackGroup(report=report) serializer = TrackGroupSerializer( instance=track_group, context=dict(request=request), data=request.data ) if serializer.is_valid(): ...
Je prends l'identifiant de rapport de l'URL, donc je pense que cela fonctionnera:
class TrackGroupSerializer(serializers.ModelSerializer): class Meta: model = TrackGroup fields = ('id', 'name', 'report', 'tracks') # `report` is FK
Cela ne fonctionne pas car le sérialiseur a une erreur pour le champ rapport
car le champ est manquant et obligatoire. Quelle est la bonne façon de fournir des données telles que rapport
et de les conserver dans les champs TrackGroupSerializer
car ce sérialiseur est utilisé pour renvoyer toutes les données en réponse.
Merci
3 Réponses :
Définissez le drapeau requis sur FALSE STRY> dans le sérialiseur modèle class TrackGroup(models.Model):
report = models.CharField(default = '-')
Vous pouvez définir les données sous forme de dict avec toutes les clés et non comme données de demande comme ceci
data = {'report': report.id, **request.data} serializer = TrackGroupSerializer( instance=track_group, context=dict(request=request), data=data )
La bonne solution semble être partial=True
:
serializer = TrackGroupSerializer( instance=track_group, context=dict(request=request), data=request.data, partial=True )
Cela semble être plus propre que de modifier les données de la requête.