Django-rest-framework: AttributeError: الكائن "OrderedDict" ليس له سمة "pk"

تم إنشاؤها على ٢٤ مايو ٢٠١٥  ·  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.save() أو استخدم serializer.validated_data للوصول إلى البيانات قبل الحفظ.
يجب أن نأخذ في الاعتبار حماية صريحة ضد هذا الاستخدام.

ال 4 كومينتر

تكون الخاصية serializer.data صالحة فقط إذا كان لديك مثيل محفوظ إلى جهاز التسلسل.
إما أن تتصل بـ serializer.save() أو استخدم serializer.validated_data للوصول إلى البيانات قبل الحفظ.
يجب أن نأخذ في الاعتبار حماية صريحة ضد هذا الاستخدام.

لقد واجهت هذا أيضًا باستخدام مصمم تفاصيل المسار للغرض نفسه. استغرق وقتا طويلا لمعرفة ما كان يجري. سيكون من المفيد إذا كان هناك حارس ضد هذا الذي ذكر إجابتك السابقة 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 إذا لم تكن هناك أخطاء.
أعتقد أنه يمكننا إزالة - من خلال الإهمال - الأسطر 224/225 على https://github.com/tomchristie/django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L224

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات