通过一个序列化程序保存两个相关模型,并将第一个id作为django rest框架中的外键传递给第二个?

问题描述 投票:0回答:1

我有一个JourneySchedule模型,存储出发和返程:

class JouaneySchedule(models.Model):
  Owner = models.ForeignKey('Profile', on_delete=models.PROTECT)
  ReturnOf = models.ForeignKey('self', on_delete=models.CASCADE, null=True)
  JourneyDate = models.DateField(null=True)
  JourneyStartTime = models.TimeField()
  IsDepart = models.BooleanField(default=True)
  Fare = models.PositiveIntegerField(null=False, default=0)

出发和返回旅程通过ReturnOf自己的外键连接。

旅程序列化器是:

class JourneyScheduleSerializer(serializers.ModelSerializer):
Owner = serializers.ReadOnlyField(source='user.id')
ReturnOf = serializers.ReadOnlyField()

class Meta:
    model = JourneySchedule
    fields = (
        'id',
        'Driver',
        'ReturnOf',
        'JourneyDate',
        'JourneyStartTime',
        'IsDepart',
        'Fare'
    )

我已经定义了Commute模型来使用嵌套对象一次保存离开和返回旅程(两者都是旅程的实例)

class CommuteSerializer(serializers.Serializer):
    depart_journey = JourneyScheduleSerializer(required=False)
    return_journey = JourneyScheduleSerializer(required=False)

    class Meta:
        model = JourneySchedule
        fields = ('depart_journey', 'return_journey')

所以我需要首先保存depart_journey,然后将id传递给return_journey作为ReturnOf字段。我怎样才能做到这一点?

django django-rest-framework serializer django-rest-viewsets nest-nested-object
1个回答
1
投票

你需要覆盖createCommuteSerializer方法,如下所示:

from collections import namedtuple

class CommuteSerializer(serializers.SerializerSerializer):
    depart_journey = JourneyScheduleSerializer(required=False)
    return_journey = JourneyScheduleSerializer(required=False)

    def create(self, validated_data):
        depart_journey = validated_data['depart_journey']
        return_journey = validated_data['return_journey']
        depart_object = JourneySchedule.objects.create(**depart_journey)
        return_object = JourneySchedule.objects.create(ReturnOf=depart_object, **return_journey)
        commute = namedtuple('commute', ['depart_journey', 'return_journey'])
        return commute(depart_journey=depart_journey, return_journey=depart_object) 
© www.soinside.com 2019 - 2024. All rights reserved.