Назначение внешнего ключа с помощью вложенных сериализаторов в Django REST Framework
Django REST Framework (DRF) предоставляет удобный способ управления отношениями внешних ключей в сериализованные данные. Однако получение желаемого поведения во вложенных сериализаторах может быть сложной задачей.
Назначение внешнего ключа во вложенных сериализаторах
Вложенные сериализаторы наследуют поведение своих родительских сериализаторов. По умолчанию они не допускают прямого назначения или изменения внешних ключей. Чтобы преодолеть эту проблему, общепринятым подходом является указание дополнительного поля для идентификатора внешнего ключа. Однако это может привести к неоднозначной фронтенд-разработке.
Альтернативные решения
1. Пользовательский метод to_representation():
Одним из решений является переопределение метода to_representation() родительского сериализатора. Это позволяет включать пользовательские данные в сериализованный ответ.
def to_representation(self, instance): response = super().to_representation(instance) response['child'] = ChildSerializer(instance.child).data return response
Этот подход гарантирует, что внешний ключ представлен как вложенный объект сериализатора, что позволяет создавать и читать с использованием одного и того же ключа.
2. Поле linkedFieldAlternative:
Более общее решение — создать собственное поле сериализатора, поведение которого отличается от поля PrimaryKeyRelatedField по умолчанию.
class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField): def to_representation(self, instance): if self.serializer: return self.serializer(instance, context=self.context).data return super().to_representation(instance)
Это поле позволяет указать сериализатор для представления внешнего ключа.
Использование поля linkedFieldAlternative
Поле linkedFieldAlternative затем можно использовать в родительском сериализаторе следующим образом:
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)
Преимущества использования настраиваемого поля
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3