【问题标题】:How to save a nested object in separate models in Django?如何在 Django 的单独模型中保存嵌套对象?
【发布时间】:2022-01-04 07:44:33
【问题描述】:

我正在尝试将嵌套对象保存到我的 Django 应用程序中的两个不同的表中。我遗漏了一些东西,因为我从子模型中得到了验证错误。我的events 中的数据无法识别,并且序列化程序验证失败。我需要以某种方式修改我的序列化程序还是我的模型有问题?

我有这两个模型:

class Plan(models.Model):
    name = models.CharField(max_length=200)

class PlanEvent(models.Model):
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
    done = models.BooleanField()
    title = models.CharField(max_length=100, blank=True)

然后我有这些序列化程序用于我的模型:

class PlanEventSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlanEvent
        fields = '__all__'


class PlanSerializer(serializers.ModelSerializer):
    events = PlanEventSerializer(many=True)

    class Meta:
        model = Plan
        fields  = ('name', 'events')

    def create(self, validated_data):
        events_validated_data = validated_data.pop('events')
        plan = Plan.objects.create(**validated_data)
        plan_event_serializer = self.fields['events']
        for p in events_validated_data:
            p['plan'] = plan
        events = plan_event_serializer.create(events_validated_data)
        return plan

在我的views.py 我这样做:

class PlanView(APIView):
    permission_classes = [AllowAny,]
    serializer_class = PlanSerializer

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我尝试使用此有效负载将 Plan 和 PlanEvent 保存到他们自己的表中:

{
  "name": "some name",
  "events": [
    {
      "done": false,
      "title": "some title"
    },
    {
      "done": true,
      "title": "some title"
    }
  ]
}

这每次都会给我一个错误消息 400 Bad Request:

    {
    "events": [
        {
            "plan": [
                "This field is required."
            ]
        },
        {
            "plan": [
                "This field is required."
            ]
        }
    ]
}

【问题讨论】:

  • 看来,您需要在序列化程序中传递计划主键,而不是计划对象。 for p in events_validated_data:p['plan'] = plan.id
  • @Yerycs 感谢您的建议,但这似乎不起作用。代码实际上并没有达到那个create - 方法,它在这一行中失败:serializer = self.serializer_class(data=request.data) in class PlanView
  • 请在 PlanEventSerializer 中指定每个字段(不使用 all )。但不包括计划外键字段。
  • @Yerycs 谢谢,这是需要的,还有一个导致问题的错字。

标签: python django django-models serialization django-serializer


【解决方案1】:

看来,您需要传递计划主键,而不是 PlanSerializer 中的计划对象。

for p in events_validated_data:
            p['plan'] = plan.id

【讨论】:

    【解决方案2】:

    问题是,我在这里搞错了:

     for p in events_validated_data:
         p['plan'] = plan
    

    应该是这样的:

     for p in events_validated_data:
         p['id'] = plan
    

    还必须按照 Yery cs 的建议从序列化程序中排除外键字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2017-06-21
      • 2012-04-13
      • 2017-05-22
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多