Help with DRF error

36 views
Skip to first unread message

Larry Martell

unread,
Dec 16, 2023, 11:00:19 AM12/16/23
to django...@googlegroups.com
I have a DRF API. It is throwing an error that I have not been able to fix.

Here is my view and serializer:

class CreateNotations(CreateAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = NotationListSerializer

    def post(self, request, *args, **kwargs):
        return super().post(request, *args, **kwargs)

class NotationListSerializer(serializers.Serializer):
    workitem_id = serializers.PrimaryKeyRelatedField(queryset=WorkItem.objects.all(), source="workitem")
    notations = NotationSerializer(many=True)

    def create(self, validated_data):
        workitem = validated_data["workitem"]

        IncompleteAnalysis.objects.filter(workitem=workitem).delete()

        data = []
        for notation in validated_data["notations"]:
            data.append({
                'workitem': workitem,
                'incomplete_analysis_reason': notation["reason"],
                'vessel_affected': notation["vessel"],
                'user': self.context['request'].user,
                'timestamp': datetime.now().isoformat()
            })

        return IncompleteAnalysis.objects.bulk_create([IncompleteAnalysis(**d) for d in data])

The body of the request received is:

{'workitem_id': 244, 'notations': [{'reason_id": 4, 'vessel_id': 6}]}

It fails with this:

AttributeError: Got AttributeError when attempting to get a value for field `workitem_id` on serializer `NotationListSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `list` instance.
Original exception text was: 'list' object has no attribute 'workitem'.

Here is the stack trace:

ERROR    django.request:log.py:241 Internal Server Error: /api/notations/
Traceback (most recent call last):
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/fields.py", line 446, in get_attribute
    return get_attribute(instance, self.source_attrs)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/fields.py", line 96, in get_attribute
    instance = getattr(instance, attr)
AttributeError: 'list' object has no attribute 'workitem'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/larrymartell/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 56, in inner
    response = get_response(request)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 55, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/django/views/generic/base.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/inst/martell/EVServer/app/CAPgraph/createevapi/views.py", line 1270, in post
    return super().post(request, *args, **kwargs)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/generics.py", line 190, in post
    return self.create(request, *args, **kwargs)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/mixins.py", line 20, in create
    headers = self.get_success_headers(serializer.data)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/serializers.py", line 555, in data
    ret = super().data
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/serializers.py", line 253, in data
    self._data = self.to_representation(self.instance)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/serializers.py", line 509, in to_representation
    attribute = field.get_attribute(instance)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/relations.py", line 190, in get_attribute
    return super().get_attribute(instance)
  File "/home/larrymartell/.local/lib/python3.8/site-packages/rest_framework/fields.py", line 479, in get_attribute
    raise type(exc)(msg)
AttributeError: Got AttributeError when attempting to get a value for field `workitem_id` on serializer `NotationListSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `list` instance.
Original exception text was: 'list' object has no attribute 'workitem'.
  
This is vexing as I have other very similar APIs that work fine.

Thanks!
Larry

Reddy Tintaya

unread,
Dec 16, 2023, 1:11:13 PM12/16/23
to django...@googlegroups.com
Can't you just use 
    workitem = serializers.PrimaryKeyRelatedField(queryset=WorkItem.objects.all())
instead of workitem_id?

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CACwCsY4cLuyRjLAu_xx28q_rssra7WowocevocnqgzZuu%3DnVew%40mail.gmail.com.

Larry Martell

unread,
Dec 16, 2023, 1:46:54 PM12/16/23
to django...@googlegroups.com
On Sat, Dec 16, 2023 at 1:10 PM Reddy Tintaya <rtin...@momnt.com> wrote:
Can't you just use 
    workitem = serializers.PrimaryKeyRelatedField(queryset=WorkItem.objects.all())
instead of workitem_id?

No because workitem_id is what is sent in the request. 
Reply all
Reply to author
Forward
0 new messages