Сериализатор дополнительного поля из поля ManyToMany

У меня есть эти серийники

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 в качестве идентификаторов и иметь дополнительное поле для 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 не являются идентификаторами.

Проблема в том, что department - это отношение ManyToMany, например, если бы это был просто ForeignKey, я мог бы сделать вот так, и все работало.

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

    class Meta:
        model = Doctor
        fields = '__all__'

Итак, есть ли способ достичь этого с помощью ManyToManyField? Или я должен использовать один сериализатор для визуализации и один для добавления/редактирования?

Вы можете задать department с помощью PrimaryKeyRelatedField [drf-doc], и работать с DepartmentSerializer для departmentName (хотя, возможно, лучше использовать множественное число имен):

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')
Вернуться на верх