【问题标题】:Django Rest Framework : Setting foreign key value in serializerDjango Rest Framework:在序列化程序中设置外键值
【发布时间】:2019-01-19 22:34:08
【问题描述】:

我有以下型号:

     class School(models.Model):
         id = patch.BigAutoField(primary_key=True)
         name = models.CharField('Name', max_length=100)
         address = models.CharField('Address', max_length=500, blank=True, null=True)

     class Child(BaseModel):
         id = patch.BigAutoField(primary_key=True)
         name = models.CharField('Name', max_length=100, blank=True, null=True)
         school = models.ForeignKey('User', blank=True, null=True, db_constraint=False, db_index=True, on_delete=models.CASCADE, default=None)

我有以下序列化程序:

    class SchoolSerializer(serializers.Serializer):
        id = serializers.IntegerField(read_only=True)
        name = serializers.CharField(required=True, max_length=100)
        address = serializers.CharField(required=False, max_length=400)

        def create(self, validated_data):
            return School.objects.create(**validated_data)

        def update(self, instance, validated_data):
            instance.name = validated_data.get('name', instance.name)
            instance.address = validated_data.get('address', instance.address)
            instance.save()
            return instance

        class Meta:
            model = School
            fields = ('id', 'name', 'address')

    class ChildSerializer(serializers.Serializer):
        id = serializers.IntegerField(read_only=True)
        name = serializers.CharField(required=False, max_length=100, allow_blank=False)
        school = SchoolSerializer()

        def create(self, validated_data):
            return Child.objects.create(**validated_data)

        def update(self, instance, validated_data):
            instance.name = validated_data.get('name', instance.name)
            instance.school = validated_data.get('school', instance.school)
            instance.save()
            return instance

现在我面临的问题是,当我使用序列化程序在子表中保存任何值时,学校的值在我的数据库中显示为 null,但在我的请求对象中,我得到了 school_id 的值。

【问题讨论】:

  • 设置 SchoolSerializer(read_only=True) 并尝试添加数据

标签: python django django-rest-framework


【解决方案1】:

由于这个school = SchoolSerializer() 学校将是一个完全序列化的对象,而不是标量值。

看看这个例子,它应该会有所帮助:Writable nested serializer with existing objects using Django Rest Framework 3.2.2

您必须手动将序列化对象 school 转换为标量值学校 PK 以填充 school_id FK 字段。或者只是删除school = SchoolSerializer(),然后ChildSerializer 将开始将此字段序列化为标量值(但仍然是FK),从而使其可直接写入school_id 字段。其余代码应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2016-04-10
    • 2021-04-09
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多