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.