๊ฒฌํด:
@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']:
์ง๋ ฌ ๋ณํ๊ธฐ:
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()
์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ์ธ์ํ๋ ค๊ณ ํ ๋ :
TaskCreateQuoteSerializer(data={u'servicetasks': [3115, 3114]}, task=<Task: E13/688 COMPLETE>):
servicetasks = PrimaryKeyRelatedField(allow_null=False, many=True, queryset=[<ServiceTask: Ser...]
๋ฐ๋ผ์ serializer.data์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ ๋๋ง๋ค ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
AttributeError: 'OrderedDict' ๊ฐ์ฒด์ '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:
serializer.data ์์ฑ์ serializer์ ์ ์ฅ๋ ์ธ์คํด์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ ํจํฉ๋๋ค.
serializer.save()
๋ฅผ ํธ์ถํ๊ฑฐ๋ serializer.validated_data
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ๊ธฐ ์ ์ ๋ฐ์ดํฐ์ ์ก์ธ์คํ์ญ์์ค.
์ฐ๋ฆฌ๋ ์ด ์ฌ์ฉ๋ฒ์ ๋ํ ๋ช
์์ ์ธ ๋ณดํธ๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋น์ทํ ๋ชฉ์ ์ผ๋ก detail_route ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ ํ์ต๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์๋ด๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. 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 ํ์ฌ ์ค๋ฅ๋ data
์ ์ก์ธ์คํ๋ ๋์์ด๋ฏ๋ก "serializer.save()๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ ์ฅํ๊ธฐ ์ ์ ๋ ์ง์ ์ก์ธ์คํ๊ธฐ ์ํด serializer.validated_data๋ฅผ ์ฌ์ฉํฉ๋๋ค."๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ๋์ค์๋ ์ด์จ๋ ๊ทธ ๊ฒฝ์ฐ์ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ ๋จ.
์ง๋ฌธ: ์ค๋ฅ๊ฐ ์์ผ๋ฉด data
๊ฐ validated_data
๋ก ์ฑ์์ง๊ธฐ๋ฅผ ์ํฉ๋๊น?
์ง์ ์ค๋จ์ ํตํด https://github.com/tomchristie/django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L ์์ ๋ผ์ธ 224/225๋ฅผ ์ ๊ฑฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
serializer.data ์์ฑ์ serializer์ ์ ์ฅ๋ ์ธ์คํด์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ ํจํฉ๋๋ค.
serializer.save()
๋ฅผ ํธ์ถํ๊ฑฐ๋serializer.validated_data
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ๊ธฐ ์ ์ ๋ฐ์ดํฐ์ ์ก์ธ์คํ์ญ์์ค.์ฐ๋ฆฌ๋ ์ด ์ฌ์ฉ๋ฒ์ ๋ํ ๋ช ์์ ์ธ ๋ณดํธ๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.