【问题标题】:django m2m field return objects instead of keysdjango m2m 字段返回对象而不是键
【发布时间】:2018-04-25 19:16:48
【问题描述】:

我有一个模型:

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]}]

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

【问题讨论】:

  • 序列化器的想法不是只返回对象的id吗?
  • 我不确定,但我想不一定
  • 它只是发生在我身上(阅读下面的第一个答案):您是否希望将 Task 对象表示为带有字段的序列化数据?我理解你的问题是指Task 对象,就像在 Python 类实例中一样。
  • @Ralf 好点。我以为它的意思是 JSON 对象,但可以选择任何一种方式

标签: django django-rest-framework


【解决方案1】:

你需要一个TaskSerializer,然后告诉ScenarioSerializer它应该使用嵌套的序列化器来表示任务。类似于以下内容:

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

关于 POST 数据的说明: 嵌套序列化程序使用与标准基于 pk 的关系完全不同的模式。在写入数据时尤其如此。例如,不清楚嵌套写入应该使用get_or_create 还是只使用create 用于相关对象。默认情况下,DRF 序列化程序不处理嵌套写入。查看the docs 了解嵌套关系的详细信息,包括如何处理可写嵌套序列化程序。

【讨论】:

  • 甜蜜!很高兴我能帮上忙
  • 我有一个问题,在这种情况下,我是否还必须修改我的 POST 请求以发送任务对象而不是它们的 ID?因为 GET 有效,但 POST 开始失败!
  • 请使用 POST 方法查看更新的问题以供参考,它不会到达 serializer.is_valid() 内部并引发 BAD REQUEST 错误
  • 你说得对,我应该在回复中提到它。您的问题显然是关于阅读的,但在我的回答中,我使用的是我自己的一个可写嵌套序列化程序作为模型,而不是去文档。我已经更新了我的回复。
  • 处理这种情况最简单的方法是什么?从前端调整我的请求 JSON 数据或在 django 部分修改我的序列化程序?
猜你喜欢
  • 2013-08-11
  • 2013-02-05
  • 1970-01-01
  • 2019-02-20
  • 2016-09-07
  • 2015-03-04
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多