Reputation: 5366
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
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