Django序列化程序DoesNotExist:匹配查询不存在错误

Django序列化程序DoesNotExist:匹配查询不存在错误,django,django-rest-framework,Django,Django Rest Framework,我有一个场景模型: class Scenario(models.Model): stakeholder = models.ForeignKey(User, related_name='scenarios', blank=True,) tasks = models.ManyToManyField(Task, blank=True) 序列化程序: class ScenarioSerializer(serializers.ModelSerializer): tasks = T

我有一个场景模型:

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

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
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__'
和视图来创建场景:

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)
视图中的打印语句打印:

{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''}]}
序列化程序create()方法中的print语句打印:

('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>)]))
虽然我收到了错误,但创建了一个场景,但没有任务。

堆栈跟踪:

[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
[27/Apr/2018 10:33:37]“选项/api/scenarios/HTTP/1.1”200 0
{u'tasks':[{u'Lorem',u'涉众:'u'Lorem',u'why_perform_task':u'Lorem',u'how_Frequency':u'MO',u'title':u'One',u'how_important_task':u'RI',u'people__(相关人员:'Lorem u'required u'special(培训):False,u'why(重要)task:无,u'project':1,u'sequence(行动顺序:u'Lorement)u'Lorementation':u'Lorementation':u'LI u'LIm',u'改进的好处:u'Lorem',u'effects\u任务:u'Lorem',u'tools\u used':u'Lorem',u'special\u词汇:u'Lorem',u'id':1,u'任何改进:u'Lorem',u'training\u required':u'Lorem',{u'what'u can'u go'u Fault'u':u'、u'why'u perform'u task:u'、u'how'u Frequency'、u'Eleven'、u'how'u important'u task':u'、u'people'u':u'、u'special'u training'required'u':无、u'why'u重要'task':无、u'project':1、u'sequence'u行动顺序:u'、u'、u'how'important'u改善:u'、u'、u'role'、u'Profession'“:u'',u'effects'(任务的效果):u'',u'tools'(使用的工具):u'',u'special'(使用的词汇):u'',u'id':11,u'any(改进):u'',u'所需的培训:u'}]
(“任务数据:”,有序信息([(你的标题,你的一)”,(你的频率,你的动作),(你的任务如何重要,你的知识),(你的角色,你的知识),(你为什么执行任务,你的知识),(你为什么重要任务,没有),(你的行动顺序,你的知识),(你使用的工具,你的知识),(你需要的特殊培训),假),(你需要什么培训,你的知识),等等),(你会犯什么错误,你的知识),(你的任务的影响,你的知识),(你使用的特殊词汇,你的知识),(你参与的人,你的知识),(你的任何改进,你的知识),(你的改进有多重要,你的知识),(你的改进的好处,你的知识),(你的利益相关者,),(你的项目,))
内部服务器错误:/api/场景/
回溯(最近一次呼叫最后一次):
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\core\handlers\exception.py”,第41行,在内部
响应=获取响应(请求)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\core\handlers\base.py”,第187行,在\u get\u响应中
response=self.process\u异常\u由\u中间件(e,请求)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\core\handlers\base.py”,第185行,在\u get\u响应中
响应=包装的回调(请求,*回调参数,**回调参数)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\views\decorators\csrf.py”,第58行,包装视图
返回视图函数(*args,**kwargs)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\views\generic\base.py”,第68行,在视图中
返回自调度(请求,*args,**kwargs)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\rest\u framework\views.py”,第483行,在调度中
响应=自身处理异常(exc)
句柄异常中的文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\rest\u framework\views.py”,第443行
自举未捕获异常(exc)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\rest\u framework\views.py”,第480行,在dispatch中
响应=处理程序(请求、*args、**kwargs)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\rest\u framework\decorators.py”,第53行,在处理程序中
返回函数(*args,**kwargs)
方案列表第37行的文件“D:\Development\Bern\VB\u rewrite\VB\u DRF\u Backend\scenarios\views.py”
serializer.save(涉众=request.user)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\rest\u framework\serializers.py”,第214行,保存
self.instance=self.create(已验证的_数据)
文件“D:\Development\Bern\VB\u rewrite\VB\u DRF\u Backend\scenarios\serializers.py”,第17行,在create中
task=task.objects.get(pk=task\u data.get('id'))
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\db\models\manager.py”,第85行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“D:\Development\Bern\VB\u rewrite\VB\u env\u drf\lib\site packages\django\db\models\query.py”,第380行,在get中
self.model.\u meta.object\u name
DoesNotExist:任务匹配查询不存在。
[27/Apr/2018 10:33:38]“POST/api/scenarios/HTTP/1.1”500 18923

如下更改您的
任务序列化程序,

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

并期望请求有效负载为,

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

        ],


}

将您的
任务序列化程序更改如下,

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

并期望请求有效负载为,

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

        ],


}

你的任务指令没有id KEYES,但是如果你看到打印输出,它在查看之前是可用的。我想知道为什么它在序列化中丢失。错误一定在
TaskSerializer
中。也许你忘了将
id
添加到它的字段中?显示相关的代码。顺便说一句,你目前显示的代码对我来说很好。你能添加
TaskSe吗rializer
?我已经更新了我的问题,你可以看一看吗?你的任务指令没有id KEYES,但是如果你看到打印输出,它在查看之前是可用的。我想知道为什么它在序列化中丢失了。错误一定在
任务序列化器中。
。也许你忘记了将
id
添加到它的字段中。显示相关代码。顺便说一句,到目前为止您显示的代码对我来说很好。您可以添加
TaskSerializer
?我已经更新了我的问题,您可以看一下吗?