【问题标题】:Writable nested serializer on django rest framework validation error on the nested foreign key. Field is required嵌套外键上的 django rest 框架验证错误的可写嵌套序列化程序。必填字段
【发布时间】:2018-08-13 12:21:30
【问题描述】:

我正在尝试在 Django Rest Framework 中创建一个可写的嵌套序列化程序。但我收到验证错误:slug 是必需的。但它是外键,在插入父对象之前是未知的。

这是我的模型和序列化程序:

型号:

class Letter(BaseModel):
    char = models.CharField(
        max_length=1,
    )
    slug = models.ForeignKey(
        to="core.LetterSlug",
        related_name="letters",
        on_delete=models.CASCADE,
    )


class LetterSlug(BaseModel):
    char = models.CharField(
        max_length=1,
    )

序列化器:

class LetterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Letter
        fields = '__all__'


class LetterSlugSerializer(serializers.ModelSerializer):
    letters = LetterSerializer(many=True,instance=Letter.objects.all())

    class Meta:
        model = LetterSlug
        fields = ('char', 'letters')

    def create(self, validated_data):
        letter_data = validated_data.pop('letters')
        slug = LetterSlug.objects.create(**validated_data)
        Letter.objects.create(slug=slug, **letter_data)

        return slug

我希望它添加几个 Letter 对象,所有这些对象都与新创建的 LetterSlug 对象共享相同的外键。

我尝试注释掉我的 create 方法的内容,并在调用 create 方法之前确保它在验证期间。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    只需在 LetterSerializer 中将 slug 设为只读:

    class LetterSerializer(serializers.ModelSerializer):
        class Meta:
            model = Letter
            fields = '__all__'
            read_only_fields = ("slug", )
    

    还可以编辑您的其他序列化程序,如下所示:

    class LetterSlugSerializer(serializers.ModelSerializer):
        letters = LetterSerializer(many=True)
    
        class Meta:
            model = LetterSlug
            fields = ('char', 'letters')
    
        def create(self, validated_data):
            letters_data = validated_data.pop('letters')
            slug = super().create(**validated_data)
            Letter.objects.bulk_create([ Letter(slug=slug, **letter) for letter in letters_data ])
            return slug
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 2021-06-23
      • 2019-12-23
      • 1970-01-01
      • 2018-07-06
      • 2014-10-07
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多