1

I'm trying to create a post request to add a job application to the list of applicants. This is done by POST /task-worker/<task_id>

However, I get the error:

'Request' object has no attribute 'task'

Models.py

class Task_worker(models.Model):
    worker = models.ForeignKey(Worker)
    task = models.ForeignKey(Task)

    class Meta:
        unique_together = ('worker', 'task')

class Task(models.Model):
    ...

class Worker(models.Model):
    ...

serializers.py

class TaskWorkerSerializer(serializers.ModelSerializer):
    task = serializers.ReadOnlyField(source='task.id')
    worker = serializers.ReadOnlyField(source='worker.id')

    class Meta:
        model = Task_worker
        fields = ('id', 'task', 'worker', 'created', )

    def create(self, validated_data):
        validated_data['task_id'] = self.context['request'].task
        return super(TaskWorkerSerializer, self).create(validated_data)

views.py

class TaskWorker(generics.ListCreateAPIView):
    serializer_class = TaskWorkerSerializer

    def get_queryset(self):
        task_id = self.kwargs.get('task_id', '')
        queryset = Task_worker.objects.filter(task__user=self.request.user, task_id=task_id).distinct()
        return queryset

    def perform_create(self, serializer):
        worker = Worker.objects.get(user=self.request.user)
        task = Task.objects.get(pk=self.kwargs.get('task_id', ''))
        serializer.save(task=task, worker=worker)
        #ALSO TRIED
        #serializer.save(task_id=self.kwargs.get('task_id', ''), worker=worker)

Even if I don't have task explicitly in perform_create(), I still get the same error, saying request has no task attribute.

urls.py

url(r'^task-worker/(?P<task_id>[0-9]+)/$', views.TaskWorker.as_view()),

EDIT: Full Traceback.

Traceback:  

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/request.py" in __getattr__
  410.             return getattr(self._request, attr)


      During handling of the above exception ('WSGIRequest' object has no attribute 'task'), another exception occurred:



File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  494.             response = self.handle_exception(exc)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
  454.             self.raise_uncaught_exception(exc)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  491.             response = handler(request, *args, **kwargs)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/generics.py" in post
  244.         return self.create(request, *args, **kwargs)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/mixins.py" in create
  21.         self.perform_create(serializer)

File "/Users/gr/Desktop/PycharmProjects/godo/api/views.py" in perform_create
  42.         serializer.save(task_id=self.kwargs.get('task_id', ''), worker=worker)

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/serializers.py" in save
  214.             self.instance = self.create(validated_data)

File "/Users/gr/Desktop/PycharmProjects/godo/api/serializers.py" in create
  25.         validated_data['task_id'] = self.context['request'].task

File "/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/request.py" in __getattr__
  412.             return self.__getattribute__(attr)

Exception Type: AttributeError at /api/task-worker/17/
Exception Value: 'Request' object has no attribute 'task'
5
  • you want to add entry to Task_worker model ? Commented Jan 31, 2018 at 12:31
  • @VikasDamodar Yes, but because it's a many-to-many (Task_worker) is a trough table, I needed to specify task_id Commented Jan 31, 2018 at 12:32
  • It's not clear were that error is happening. Please post the full traceback. Commented Jan 31, 2018 at 12:34
  • @DanielRoseman Added Commented Jan 31, 2018 at 12:35
  • I think problem in serializers.py, Can you add that one also ? Commented Jan 31, 2018 at 12:38

1 Answer 1

3

You dont need this line validated_data['task_id'] = self.context['request'].task in serializer's create method. Task wil be added automatically.

Also you dont need validated_data['worker'] = self.context['request'].worker if you have this.

From the docs:

Any additional keyword arguments will be included in the validated_data argument when .create() or .update() are called.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.