Django休息框架嵌套序列化无法正常工作

时间:2016-07-15 04:20:13

标签: python django debugging serialization django-rest-framework

我的应用程序中有这些序列化程序:

class ScheduleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Schedule
        fields = ('id',)

class DisciplineSerializer(serializers.ModelSerializer):
    class Meta:
        model = Discipline
        fields = ('id',)


class WriteTeacherSerializer(serializers.ModelSerializer):
    disciplines = DisciplineSerializer(many=True)
    schedules = ScheduleSerializer(many=True)
    class Meta:
        model = Teacher
        fields = ('phone_number', 'bio', 'price', 'disciplines', 'schedules')
        depth = 1

    def update(self, instance, validated_data):

        print "\n"
        #Debugging here
        print validated_data
        print "\n"
        print instance.__dict__
        print "\n"

        instance.phone_number = validated_data['phone_number']
        instance.bio = validated_data['bio']
        instance.price = validated_data['price']
        disciplines = validated_data.pop('disciplines')
        schedules = validated_data.pop('schedules')
        for discipline in disciplines:
            try:
                stored_discipline = Discipline.objects.get(id=discipline['id'])
                instance.disciplines.add(stored_discipline)
            except Discipline.DoesNotExist:
                raise Http404

        for schedule in schedules:
            try:
                stored_schedule = Schedule.objects.get(id=schedule['id'])
                instance.schedules.add(stored_discipline)
            except Discipline.DoesNotExist:
                raise Http404
        instance.save()
        return instance

正如您所看到的,我正在尝试使用字段schedulesdisciplines进行嵌套序列化。我想我遵循了文档,但是当我测试它时,嵌套序列化不起作用。我打印了instancevalidated_data个对象并在shell上测试了它。

我以这种格式启动数据:

data = {u'phone_number': u'+99999999999', u'bio': u'BIO', u'price': 40, u'disciplines': [{'id': 1}], u'schedules': [{'id': 2}]}

我有一个教师实例并启动了这样的序列化器:

serializer = WriteTeacherSerializer(teacher, data=data)

serializer.is_valid()来电时显示为真。

但是当我尝试保存时,validated_datainstance.__dict__就是这样:

#validated_data
{u'phone_number': u'+5584998727770', u'bio': u'BIO', u'price': 40, u'disciplines': [OrderedDict()], u'schedules': [OrderedDict()]}


#instance.__dict__
{'phone_number': u'', 'bio': u'', 'price': 50, 'profile_id': 2, '_state': <django.db.models.base.ModelState object at 0xb64a6bec>, 'id': 6}

他们似乎没有注意到update()方法不起作用的嵌套字段。

我做错了吗?

以下是我的教师模型:

class Teacher(models.Model):

    price = models.IntegerField(default=50)
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Wrong phone number format.")
    phone_number = models.CharField(validators=[phone_regex], max_length=15, blank=True)
    profile = models.OneToOneField(Profile, on_delete=models.CASCADE)
    schedules = models.ManyToManyField(Schedule, related_name='schedules')
    disciplines = models.ManyToManyField(Discipline, related_name='disciplines')
    bio = models.CharField(max_length=200, blank=True)

1 个答案:

答案 0 :(得分:2)

如果您只是发送IDs,那么您不需要添加嵌套序列化程序,只需指定ForeignKeyManyToManyField的字段名称。

class WriteTeacherSerializer(serializers.ModelSerializer):

    class Meta:
        model = Teacher
        fields = ('phone_number', 'bio', 'price', 'disciplines', 'schedules')

我也想知道是不是因为你有depth=1旗帜?

DRF不支持嵌套更新。您必须覆盖Serializer的更新方法,并编写自己的更新逻辑,以便在发送嵌套数据时发现此警告的错误。