Django-rest-framework: AttributeError: 'OrderedDict' ๊ฐœ์ฒด์— 'pk' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 05์›” 24์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: encode/django-rest-framework

๊ฒฌํ•ด:

@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 ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜์‹ญ์‹œ์˜ค.
์šฐ๋ฆฌ๋Š” ์ด ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ ๋ณดํ˜ธ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

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๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰