在序列化器中从同一模型创建两个字段

问题描述 投票:0回答:2

我在另一个序列化器中使用嵌套序列化器,并且我有两个模型

Object
ObjectMedia
请参阅以下代码:

class ObjectMediaSerializer(serializers.ModelSerializer):
    media_address = serializers.SerializerMethodField()    
    class Meta:
        model = ObjectMedia
        fields = ["media_address", "type"]

class ObjectAddEditSerializer(serializers.ModelSerializer):
   
    slug = serializers.SlugField(read_only=True)
    object_medias = ObjectMediaSerializer(many=True, required=True)

    class Meta:
        model = Program
        fields = [
            "slug",
            "object_medias",
        ]

我想在两个字段中添加对象媒体(按类型分隔),如下所示,但我不知道这是如何实现的:

{
  "slug":"my_slug",
  "object_media_type1": [
    {
      "media_address ": "somewhere",
       "type":TYPE1
    }
  ],
"object_media_type2": [
    {
      "media_address ": "somewhere",
       "type":TYPE2
    },
      {
      "media_address ": "somewhere\else",
       "type":TYPE2
    }]
}
python django django-rest-framework django-serializer
2个回答
2
投票

您可以使用

SerializerMethodField
来完成此操作:

class ObjectAddEditSerializer(serializers.ModelSerializer):
   
    slug = serializers.SlugField(read_only=True)
    object_media_type1 = serializers.SerializerMethodField()
    object_media_type2 = serializers.SerializerMethodField()

    def get_object_media_type1(self, instance):
        return ObjectMediaSerializer(instance.object_medias.filter(type="type1"), many=True).data

    def get_object_media_type2(self, instance):
        return ObjectMediaSerializer(instance.object_medias.filter(type="type2"), many=True).data

    class Meta:
        model = Program
        fields = [
            "slug",
            "object_media_type1",
            "object_media_type2",
        ]

请注意它们是只读的。官方文档这里.


0
投票

您可以使用嵌套序列化器来实现只读目的:


class ObjectMediaSerializer(serializers.ModelSerializer):
    media_address = serializers.SerializerMethodField()    
    class Meta:
        model = ObjectMedia
        fields = ["media_address", "type"]

class ObjectAddEditSerializer(serializers.ModelSerializer):
   
    slug = serializers.SlugField(read_only=True)
    object_medias_1 = ObjectMediaSerializer(source='your-fk-relation', many=True, required=True)
    object_medias_2 = ObjectMediaSerializer(source='your-fk-relation', many=True, required=True)


    class Meta:
        model = Program
        fields = [
            "slug",
            "object_medias_1",
            "object_medias_2",
        ]

© www.soinside.com 2019 - 2024. All rights reserved.