【问题标题】:Serializer extra field from a ManyToMany Field来自多对多字段的序列化程序额外字段
【发布时间】:2021-10-11 10:12:23
【问题描述】:

我有这些序列化程序

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = ('name', 'slug', 'image', 'description')


class DoctorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Doctor
        fields = '__all__'
        depth = 1

而当前的表示是这样的:

   {
        "id": 1,
        "first_name": "Jhon",
        "last_name": "Doe",
        "slug": "jhon-doe",
        "email": null,
        "phone": null,
        "title": null,
        "description": "",
        "image": "http://localhost:8000/media/studio/default.jpg",
        "department": [
            {
                "id": 1,
                "name": "Acupuncture",
                "slug": "Acupuncture",
                "image": "http://localhost:8000/media/studio/acupuncture-min.jpg",
                "description": "Acupuncture"
            },
            {
                "id": 3,
                "name": "Cardiology",
                "slug": "cardiology",
                "image": "http://localhost:8000/media/studio/default.jpg",
                "description": "Cardiology"
            }
        ]
    }

我想将 department 字段保留为 ID,并为 departmentName 提供一个额外字段,并具有如下表示:

   {
        "id": 1,
        "first_name": "Jhon",
        "last_name": "Doe",
        "slug": "jhon-doe",
        "email": null,
        "phone": null,
        "title": null,
        "description": "",
        "image": "http://localhost:8000/media/studio/default.jpg",
        "department": [
            1,
            3
        ]
        "departmentName": [
            {
                "id": 1,
                "name": "Acupuncture",
                "slug": "Acupuncture",
                "image": "http://localhost:8000/media/studio/acupuncture-min.jpg",
                "description": "Acupuncture"
            },
            {
                "id": 3,
                "name": "Cardiology",
                "slug": "cardiology",
                "image": "http://localhost:8000/media/studio/default.jpg",
                "description": "Cardiology"
            }
        ]
    }

这是因为如果我有第一个表示,我在管理 CRUD 时会遇到问题,因为 department 不是 ID。

问题是因为department 是一个多对多关系,例如,如果它只是一个 ForeignKey,我可以这样做并且它有效。

class DoctorSerializer(serializers.ModelSerializer):
    departmentName = serializers.CharField(read_only=True, source="department.name")

    class Meta:
        model = Doctor
        fields = '__all__'

那么,有没有办法通过ManyToManyField 实现这一点?或者我应该使用一个序列化器进行可视化,一个用于添加/编辑?

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    您可以使用PrimaryKeyRelatedField [drf-doc] 设置department,并为departmentName 使用DepartmentSerializer(尽管使用复数名称可能更好):

    class DoctorSerializer(serializers.ModelSerializer):
        department = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
        departmentName = DepartmentSerializer(many=True, source='department')
    
        class Meta:
            model = Doctor
            fields = ('id', 'first_name', 'last_name', 'slug', 'email', 'phone', 'title', 'description', 'image', 'department', 'departmentName')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多