الآراء:
@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
للوصول إلى البيانات قبل الحفظ.
يجب أن نأخذ في الاعتبار حماية صريحة ضد هذا الاستخدام.
لقد واجهت هذا أيضًا باستخدام مصمم تفاصيل المسار للغرض نفسه. استغرق وقتا طويلا لمعرفة ما كان يجري. سيكون من المفيد إذا كان هناك حارس ضد هذا الذي ذكر إجابتك السابقة 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
التعليق الأكثر فائدة
تكون الخاصية serializer.data صالحة فقط إذا كان لديك مثيل محفوظ إلى جهاز التسلسل.
إما أن تتصل بـ
serializer.save()
أو استخدمserializer.validated_data
للوصول إلى البيانات قبل الحفظ.يجب أن نأخذ في الاعتبار حماية صريحة ضد هذا الاستخدام.