Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django m2m字段返回对象而不是键_Django_Django Rest Framework - Fatal编程技术网

django m2m字段返回对象而不是键

django m2m字段返回对象而不是键,django,django-rest-framework,Django,Django Rest Framework,我有一个模型: class Scenario(models.Model): tasks = models.ManyToManyField(Task, blank=True) 其序列化程序: class ScenarioSerializer(serializers.ModelSerializer): class Meta: model = Scenario fields = '__all__' 以及用于检索和发布场景的视图: @api_view

我有一个模型:

class Scenario(models.Model):
    tasks = models.ManyToManyField(Task, blank=True)
其序列化程序:

class ScenarioSerializer(serializers.ModelSerializer):

    class Meta:
        model = Scenario
        fields = '__all__'
以及用于检索和发布场景的视图:

@api_view(['GET', 'POST'])
def scenarios_list(request):

    scenarios = []

    """
    List all scenarios, or create a new.
    """
    if request.method == 'GET':
        # get projects of a specific stakeholder
        if request.query_params.get('stakeholderId'):
            stakeholderId = request.query_params.get('stakeholderId')
            scenarios = Scenario.objects.filter(stakeholder=stakeholderId)
            serializer = ScenarioSerializer(scenarios, many=True)
            return Response(serializer.data)
        else:
            scenarios = Scenario.objects.all()
            serializer = ScenarioSerializer(scenarios, many=True)
            return Response(serializer.data)

    elif request.method == 'POST':
        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)
这给了我以下数据:

[{"id":1,"tasks":[1,3]},{"id":2,"tasks":[2,4,5,10]},{"id":3,"tasks":[2,5,6]},{"id":4,"tasks":[2,6,10]}]
class ScenarioSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, read_only=True)
    class Meta:
        model = Scenario
        fields = '__all__'

我想接收任务对象,而不是它们的ID。我怎样才能做到这一点

您需要一个
任务序列化程序
,然后告诉
场景序列化程序
,它应该使用嵌套序列化程序来表示任务。如下所示:

[{"id":1,"tasks":[1,3]},{"id":2,"tasks":[2,4,5,10]},{"id":3,"tasks":[2,5,6]},{"id":4,"tasks":[2,6,10]}]
class ScenarioSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, read_only=True)
    class Meta:
        model = Scenario
        fields = '__all__'
关于POST数据的说明:
嵌套序列化程序使用与标准基于pk的关系完全不同的模式。写入数据时尤其如此。例如,对于相关对象,不清楚嵌套写入是应该使用
get\u还是创建
,还是只使用
create
。默认情况下,DRF序列化程序不处理嵌套写入。查看有关嵌套关系的详细信息,包括如何处理可写嵌套序列化程序。

序列化程序的想法不是只返回对象的
id
?我不确定,但我想没有必要,我只是听到了(阅读下面的第一个答案):是否要将
任务
对象及其字段表示为序列化数据?我理解您的问题是指Python类实例中的
Task
对象。@Ralf说得好。我假设它的意思是
JSON
对象,但也可能是任意一种方式!很高兴我能帮上忙,但我有个问题,在这种情况下,我是否也应该修改我的POST请求来发送任务对象而不是它们的ID?因为GET工作但POST开始失败!请参阅更新后的问题和POST方法以供参考,它没有到达
序列化程序内部。是否有效()
并抛出错误的请求错误您是对的,我应该在我的回答中提到它。你的问题显然是关于read的,但在我的回答中,我使用了我自己的一个可写嵌套序列化程序作为模型,而不是使用文档。我已经更新了我的回复。处理这种情况最简单的方法是什么?从前端本身调优我的请求JSON数据,或者在django部分修改我的序列化程序?