vues :
@detail_route(methods=['post'])
def quote(self, request, pk):
task = self.get_object()
serializer = serializers.TaskCreateQuoteSerializer(data=request.DATA, task=task)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# this causes a problem
serializer.data['servicetasks']:
sérialiseurs :
class TaskCreateQuoteSerializer(serializers.Serializer):
servicetasks = serializers.PrimaryKeyRelatedField(many=True, required=True, allow_null=False,
queryset=ServiceTask.objects.all())
def __init__(self, task, *args, **kwargs):
super(TaskCreateQuoteSerializer, self).__init__(*args, **kwargs)
# print task.servicetask_set.all()
# self.fields['servicetasks'].queryset = task.servicetask_set.all()
Lorsque j'essaie d'imprimer le sérialiseur :
TaskCreateQuoteSerializer(data={u'servicetasks': [3115, 3114]}, task=<Task: E13/688 COMPLETE>):
servicetasks = PrimaryKeyRelatedField(allow_null=False, many=True, queryset=[<ServiceTask: Ser...]
Ainsi, chaque fois que j'essaie d'accéder à serializer.data, j'obtiens une exception :
AttributeError : l'objet 'OrderedDict' n'a pas d'attribut 'pk'
Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/rest_framework/viewsets.py" in view
85. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
452. response = self.handle_exception(exc)
File "/usr/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
449. response = handler(request, *args, **kwargs)
File "/usr/src/app/abas/apps/api/views.py" in quote
270. if not serializer.data['servicetasks']:
File "/usr/local/lib/python2.7/site-packages/rest_framework/serializers.py" in data
466. ret = super(Serializer, self).data
File "/usr/local/lib/python2.7/site-packages/rest_framework/serializers.py" in data
215. self._data = self.to_representation(self.validated_data)
File "/usr/local/lib/python2.7/site-packages/rest_framework/serializers.py" in to_representation
426. attribute = field.get_attribute(instance)
File "/usr/local/lib/python2.7/site-packages/rest_framework/relations.py" in get_attribute
364. if not instance.pk:
La propriété serializer.data n'est valide que si vous avez une instance enregistrée dans le sérialiseur.
Appelez serializer.save()
ou utilisez serializer.validated_data
pour accéder aux données avant de les enregistrer.
Nous devrions envisager une garde explicite contre cet usage.
J'ai également rencontré cela en utilisant le décorateur detail_route dans un but similaire. Il a fallu beaucoup de temps pour comprendre ce qui se passait. Ce serait utile s'il y avait une garde contre cela qui indiquait votre réponse précédente de The serializer.data property is only valid if you have a saved instance to serializer.
Either call serializer.save() or use serializer.validated_data to access date prior to saving.
@tomchristie L'erreur actuelle ici est lors de l'accès au data
donc nous ne pouvons pas dire "Appelez serializer.save() ou utilisez serializer.validated_data pour accéder à la date avant l'enregistrement." puisque ce dernier ne fonctionne pas de toute façon dans ce cas.
Édité.
La question est : voulons-nous que data
soit rempli avec validated_data
s'il n'y a pas d'erreurs.
Je pense que nous pourrions supprimer - par obsolescence - les lignes 224/225 sur https://github.com/tomchristie/django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L224
Commentaire le plus utile
La propriété serializer.data n'est valide que si vous avez une instance enregistrée dans le sérialiseur.
Appelez
serializer.save()
ou utilisezserializer.validated_data
pour accéder aux données avant de les enregistrer.Nous devrions envisager une garde explicite contre cet usage.