dilihat:
@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']:
serializer:
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()
Ketika saya mencoba dan mencetak serializer:
TaskCreateQuoteSerializer(data={u'servicetasks': [3115, 3114]}, task=<Task: E13/688 COMPLETE>):
servicetasks = PrimaryKeyRelatedField(allow_null=False, many=True, queryset=[<ServiceTask: Ser...]
Jadi setiap kali saya mencoba dan mengakses serializer.data saya mendapatkan pengecualian:
AttributeError: objek 'OrderedDict' tidak memiliki atribut '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:
Properti serializer.data hanya valid jika Anda memiliki instance yang disimpan ke serializer.
Hubungi serializer.save()
atau gunakan serializer.validated_data
untuk mengakses data sebelum menyimpan.
Kita harus mempertimbangkan perlindungan eksplisit terhadap penggunaan ini.
Saya mengalami ini juga menggunakan dekorator detail_route untuk tujuan yang sama. Butuh waktu lama untuk mencari tahu apa yang sedang terjadi. Akan sangat membantu jika ada penjaga yang menyatakan tanggapan Anda sebelumnya tentang 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 Kesalahan saat ini adalah saat mengakses data
sehingga kami tidak dapat mengatakan "Panggil serializer.save() atau gunakan serializer.validated_data untuk mengakses tanggal sebelum menyimpan." karena nanti tidak berfungsi dalam kasus itu.
Diedit.
Pertanyaannya adalah: apakah kita ingin data
diisi dengan validated_data
jika tidak ada kesalahan.
Saya pikir kami dapat menghapus - melalui penghentian - baris 224/225 di https://github.com/tomchristie/Django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L224
Komentar yang paling membantu
Properti serializer.data hanya valid jika Anda memiliki instance yang disimpan ke serializer.
Hubungi
serializer.save()
atau gunakanserializer.validated_data
untuk mengakses data sebelum menyimpan.Kita harus mempertimbangkan perlindungan eksplisit terhadap penggunaan ini.