如何在 Django Rest Framework 中制作动态字段序列化器

How to make dynamic field serializer in Django RestFramework

我想在我的 drf 项目中添加动态字段数组序列化程序:

我得到的回复是这样的:

{
    "title": "some",
    "created_at": "2022-03-06T15:59:52.684469Z",
    "fields": [
        {
            "id": 1,
            "title": "Some title?",
            "parent_field": 1
        },
        {
            "id": 2,
            "title": "Yet another fields",
            "parent_field": 1
        }
    ]
}

这是项目详细信息序列化器,fields 是另一个模型序列化器。我通过使用以下代码实现了这一点:


class AnotherFieldSerializer(serializers.ModelSerializer):
    class Meta:
        model = AnotherModel
        fields = "__all__"


class FirstSerializer(serializers.ModelSerializer):
    fields = serializers.SerializerMethodField()

    class Meta:
        model = FirstModel
        fields = "__all__"

    def get_fields(self, obj):
        serializer_context = {'request': self.context.get('request')}

        children = obj.fields
        if not children.exists():
            return None
        serializered_children = FirstSerializer(
            children,
            many=True,
            context=serializer_context
        )
        return serializered_children.data

这仅适用于 GET 请求我希望它也适用于 POST 和 PUT 请求。所以,假设我想 add/edit 一个项目到我的模型 FIRST 模型中,并通过发送这个 JSON:

添加与之关联的字段
{
    "title": "some",
    "created_at": "2022-03-06T15:59:52.684469Z",
    "fields": [
        {
            "id": 1,
            "title": "Some title?",
        },
        {
            "id": 2,
            "title": "Yet another fields",
        }
    ]
}

我知道我可以从响应中获取字段并循环遍历每个项目以创建另一个模型的实例,但我认为字段验证会困难得多。但是,如果有更多的 drf 做这件事,那就太好了。此外,我可以为 POST 和 PUT 请求制作另一个序列化程序。

我希望我的英语是可以理解的。

您可以创建一个新的序列化程序进行验证。要验证多个项目,您可以执行以下操作,

class PostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=200)
    created_at = serializers.DateTimeField()
    fields = FirstSerializer(many=True) # your model serializer for the FirstModel 

参考:https://www.django-rest-framework.org/api-guide/serializers/#listserializer