簡體   English   中英

如何在 Django 的單獨模型中保存嵌套的 object?

[英]How to save a nested object in separate models in Django?

我正在嘗試將嵌套的 object 保存到我的 Django 應用程序中的兩個不同表中。 我遺漏了一些東西,因為我從子 Model 收到驗證錯誤。 我的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

它應該是:

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

正如 Yery cs 建議的那樣,還必須從序列化程序中排除外鍵字段。

看來,您需要在 PlanSerializer 中傳遞計划主鍵,而不是計划 object。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM