Django-rest-framework: AttributeError: objek 'OrderedDict' tidak memiliki atribut 'pk'

Dibuat pada 24 Mei 2015  ·  4Komentar  ·  Sumber: encode/django-rest-framework

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:

Komentar yang paling membantu

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.

Semua 4 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat