0

我是Django Rest框架中的初學者。我想實現一對多對象映射像以下JSON模式:在Django Rest中,無法序列化具有一對多映射的對象

{ 
    "from_date": "2017-08-06T12:30", 
    "to_date": "2017-08-06T12:30", 
    "coupon_name": "WELCOME100", 
    "min_booking_value": 150, 
    "applicable_days": [ 
    { 
     "from_time": "13:00", 
     "to_time": "15:00", 
     "applicable_day": 2 
    }, 
    { 
     "from_time": "16:00", 
     "to_time": "18:00", 
     "applicable_day": 3 
    } 
    ] 
} 

對於上面的JSON模式,我創建了以下Django的模型類:

class Coupon(models.Model): 
    coupon_id = models.AutoField(primary_key=True) 
    from_date = models.DateTimeField() 
    to_date = models.DateTimeField() 
    coupon_name = models.TextField() 
    min_booking_value = models.FloatField() 

    def __unicode__(self): 
     return 'Coupon id: ' + str(self.coupon_id) 


class CouponApplicableDays(models.Model): 
    from_time = models.TimeField() 
    to_time = models.TimeField() 
    applicable_day = models.IntegerField() 

而且按照上述串級車型:

class CouponApplicableDaysSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = CouponApplicableDays 
     fields = ('from_time', 'to_time', 'applicable_day') 


class CouponSerializer(serializers.ModelSerializer): 
    coupon_applicable_days = CouponApplicableDaysSerializer(required=True, many=True) 

    class Meta: 
     model = Coupon 
     fields = ('coupon_id', 'from_date', 'to_date', 'coupon_name', 'min_booking_value', 'coupon_applicable_days',) 

    def create(self, validated_data): 
     coupon_applicable_days_data = validated_data.pop("coupon_applicable_days") 
     coupon = Coupon.objects.create(**validated_data) 
     CouponApplicableDays.objects.create(coupon=coupon, **coupon_applicable_days_data) 
     return coupon 

當我使用coupon-serializer保存數據。它僅保存在Coupon表中,而不保存在CouponApplicableDays中。

我知道,我已經搞砸了,但我不知道在哪裏。你們可以看看上面的代碼,告訴我如何解決這個問題?

回答

1

您在這裏有一個列表 coupon_applicable_days_data = validated_data.pop("coupon_applicable_days")

無論是遍歷列表和創建對象,像這樣:

for applicable_day in coupon_applicable_days_data: 
    CouponApplicableDays.objects.create(coupon=coupon, **applicable_day) 

或使用bulk_create方法 https://docs.djangoproject.com/en/1.11/ref/models/querysets/#bulk-create

CouponApplicableDays.objects.bulk_create(
    [CouponApplicableDays(coupon=coupon, **aplicable_day) 
    for applicable_day in coupon_applicable_days_data] 
) 

注意bulk_create不會觸發pre_save/post_save s ignals。