Django Rest Framework: Создание связанного объекта или поиск по идентификатору
Проблема
Мы разрабатываем API с использованием DRF для создания записи Membership, которая включает связанную запись Entity со всей личной информацией и связанную запись Address со всей адресной информацией.
В этом API мы хотим включить поведение, позволяющее API получать ID сущности для повторного использования существующей сущности или все остальные атрибуты сущности для создания новой. То же самое относится и к адресу.
Когда мы размещаем всю необходимую информацию с целью создания связанной сущности и адреса, все работает нормально, но когда мы размещаем только идентификаторы, мы сталкиваемся с проблемой.
Проблема, с которой мы столкнулись, заключается в том, что если мы отправляем ID без всех других связанных полей, мы получаем ошибки валидатора и не можем продолжить получение связанных объектов и создать основную запись.
Что мы пробовали
На данный момент мы сделали следующее:
- Создали сериализаторы для Membership, Entity и Address.
- Настройте сериализатор для Membership так, чтобы он имел связанные с ним сериализаторы Entity и Address.
- Переписали метод .create в сериализаторе Membership для создания вложенных объектов.
Ближайшая проблема/ответ, которую мы смогли найти, была это, но на самом деле нам нужно, чтобы наши связанные сериализаторы были доступны для записи, и кажется, что в этом случае решение не будет работать.
Что мы ожидаем
Что мы ожидаем сделать здесь, так это перехватить поведение DRF и сообщить ему, что при наличии ID мы можем игнорировать сериализацию или использовать поле ID для получения объекта из базы данных, если это необходимо.
Нам нужно сохранить сериализатор доступным для записи, чтобы эти объекты могли быть созданы при необходимости.
Наш код
class CoreMembership(serializers.ModelSerializer):
entity = CoreEntitySerializer(read_only=False, many=False, allow_null=True)
address = CoreAddressSerializer(read_only=False, many=False, allow_null=True)
class Meta:
model = Membership
fields = '__all__'
def create(self, validated_data):
address = validated_data.pop('address')
entity = validated_data.pop('entity')
(...)
return membership
class MstEntitySerializer(serializers.ModelSerializer):
class Meta:
model = Entity
fields = '__all__'
class MstAddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = '__all__'