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部分修改我的序列化程序?