Thinker
Thinker

Reputation: 5366

Django serializer DoesNotExist: matching query does not exist error

I have a scenario model:

class Scenario(models.Model):
    stakeholder = models.ForeignKey(User, related_name='scenarios', blank=True,)
    tasks = models.ManyToManyField(Task, blank=True)

Serializer:

class ScenarioSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, required=False)
    class Meta:
        model = Scenario
        fields = '__all__'

    def create(self, validated_data):
        tasks = validated_data.pop('tasks')
        instance = Scenario.objects.create(**validated_data)
        for task_data in tasks:
            print('task_data: ', task_data)
            task = Task.objects.get(pk=task_data.get('id'))
            instance.tasks.add(task)
        return instance

    def update(self, instance, validated_data):
        tasks = validated_data.pop('tasks', [])
        instance = super().update(instance, alidated_data)
        for task_data in tasks:
            task = Task.objects.get(pk=task_data.get('id'))
            instance.tasks.add(task)
        return instance

and view to create a scenario:

elif request.method == 'POST':
    print(request.data)
    serializer = ScenarioSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(stakeholder=request.user)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(
            serializer.errors, status=status.HTTP_400_BAD_REQUEST)

the print statement in view prints:

{u'tasks': [{u'what_can_go_wrong': u'', u'stakeholder': 2, u'why_perform_task': u'', u'how_often': u'', u'title': u'Seven', u'how_important_task': u'', u'people_involved': u'', u'special_training_required': None, u'why_important_task': None, u'project': 1, u'sequence_of_actions': u'', u'how_important_improvement': u'', u'role': u'', u'benefits_of_improvement': u'', u'effects_of_task': u'', u'tools_used': u'', u'special_vocabulary_used': u'', u'id': 7, u'any_improvements': u'', u'what_training_required': u''}, {u'what_can_go_wrong': u'', u'stakeholder': 2, u'why_perform_task': u'', u'how_often': u'DS', u'title': u'Eight', u'how_important_task': u'', u'people_involved': u'', u'special_training_required': None, u'why_important_task': None, u'project': 2, u'sequence_of_actions': u'', u'how_important_improvement': u'', u'role': u'', u'benefits_of_improvement': u'', u'effects_of_task': u'', u'tools_used': u'', u'special_vocabulary_used': u'', u'id': 8, u'any_improvements': u'', u'what_training_required': u''}]}

print statement in serializer create() method prints:

('task_data: ', OrderedDict([(u'title', u'Seven'), (u'how_often', u''), (u'how_important_task', u''), (u'role', u''), (u'why_perform_task', u''), (u'why_important_task', None), (u'sequence_of_actions', u''), (u'tools_used', u''), (u'special_training_required', None), (u'what_training_required', u''), (u'what_can_go_wrong', u''), (u'effects_of_task', u''), (u'special_vocabulary_used', u''), (u'people_involved', u''), (u'any_improvements', u''), (u'how_important_improvement', u''), (u'benefits_of_improvement', u''), (u'stakeholder', <User: reza123>), (u'project', <Project: One>)]))

and it throws error DoesNotExist: Task matching query does not exist.

Why is it happening? Somehow the id is missing when it reaches to serializer?

UPDATE: Task model and TaskSerializer:

class Task(models.Model):
    stakeholder = models.ForeignKey(User, related_name='tasks', blank=True, )
    project = models.ForeignKey(Project, related_name='project_tasks' )
    title = models.CharField(max_length=50, blank=True, null = True, )
    ...

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = '__all__'

Although I get the error, a Scenario was created but without tasks.

Stacktrace:

[27/Apr/2018 10:33:37] "OPTIONS /api/scenarios/ HTTP/1.1" 200 0
{u'tasks': [{u'what_can_go_wrong': u'Lorem', u'stakeholder': 1, u'why_perform_task': u'Lorem', u'how_often': u'MO', u'title': u'One', u'how_important_task': u'RI', u'people_involved': u'Lorem', u'special_training_required': False, u'why_important_task': None, u'project': 1, u'sequence_of_actions': u'Lorem', u'how_important_improvement': u'LI', u'role': u'Lorem', u'benefits_of_improvement': u'Lorem', u'effects_of_task': u'Lorem', u'tools_used': u'Lorem', u'special_vocabulary_used': u'Lorem', u'id': 1, u'any_improvements': u'Lorem', u'what_training_required': u'Lorem'}, {u'what_can_go_wrong': u'', u'stakeholder': 1, u'why_perform_task': u'', u'how_often': u'', u'title': u'Eleven', u'how_important_task': u'', u'people_involved': u'', u'special_training_required': None, u'why_important_task': None, u'project': 1, u'sequence_of_actions': u'', u'how_important_improvement': u'', u'role': u'', u'benefits_of_improvement': u'', u'effects_of_task': u'', u'tools_used': u'', u'special_vocabulary_used': u'', u'id': 11, u'any_improvements': u'', u'what_training_required': u''}]}
('task_data: ', OrderedDict([(u'title', u'One'), (u'how_often', u'MO'), (u'how_important_task', u'RI'), (u'role', u'Lorem'), (u'why_perform_task', u'Lorem'), (u'why_important_task', None), (u'sequence_of_actions', u'Lorem'), (u'tools_used', u'Lorem'), (u'special_training_required', False), (u'what_training_required', u'Lorem'), (u'what_can_go_wrong', u'Lorem'), (u'effects_of_task', u'Lorem'), (u'special_vocabulary_used', u'Lorem'), (u'people_involved', u'Lorem'), (u'any_improvements', u'Lorem'), (u'how_important_improvement', u'LI'), (u'benefits_of_improvement', u'Lorem'), (u'stakeholder', <User: nitish123>), (u'project', <Project: One>)]))
Internal Server Error: /api/scenarios/
Traceback (most recent call last):
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\decorators.py", line 53, in handler
    return func(*args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\VB_DRF_Backend\scenarios\views.py", line 37, in scenarios_list
    serializer.save(stakeholder=request.user)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\serializers.py", line 214, in save
    self.instance = self.create(validated_data)
  File "D:\Development\Bern\VB_rewrite\VB_DRF_Backend\scenarios\serializers.py", line 17, in create
    task = Task.objects.get(pk=task_data.get('id'))
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\db\models\query.py", line 380, in get
    self.model._meta.object_name
DoesNotExist: Task matching query does not exist.
[27/Apr/2018 10:33:38] "POST /api/scenarios/ HTTP/1.1" 500 18923

Upvotes: 0

Views: 1899

Answers (1)

JPG
JPG

Reputation: 88629

Change your TaskSerializer as below,

class TaskSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    class Meta:
        model = Task
        fields = '__all__'


and expecting a request payload as,

{
    "tasks":[
        {
            "project" : 1,
            "stakeholder":1,
            "title":"title1",
            "id":1111
        },
        {
            "project" : 2,
            "stakeholder":2,
            "title":"title2",
            "id":2222
        }

        ],


}

Upvotes: 2

Related Questions