Сериализатор дополнительного поля из поля 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')