Django rest marco campos nesteds con múltiples modelos

Este es el framework de rest Django y Django. Tengo 2 modelos: Usuario y teléfono.

El 1er problema:

Quiero poder actualizar los datos del usuario (correo electrónico) junto con los datos del teléfono (números de teléfono) en una sola respuesta de actualización de API. El número de teléfono puede ser 0 o muchos. Bueno, como parcial = verdadero en realidad. Si un usuario solo desea actualizar los números de teléfono, no actualice el correo electrónico y viceversa.


Información adicional: Al momento de registrarse, el teléfono no está incluido. Solo información básica del usuario (apellido, nombre, correo electrónico, contraseña). El teléfono solo puede actualizarse en el formulario de perfil de usuario una vez que se haya realizado el registro. El formulario de perfil de usuario en realidad está enlazando a múltiples modelos, que es Usuario y Teléfono

El segundo problema:

¿Cómo serializar múltiples números de teléfono y guardar en db?

class User(AbstractBaseUser): email = models.EmailField(unique=True, default='') USERNAME_FIELD = 'email' class Phone(models.Model): phone_number = models.CharField(max_length=10) owner = models.ForeignKey(User) -------------------------------------- class UserSerializer(serializers.ModelSerializer): phone_number = PhoneSerializer(required=False, many=True) class Meta: model = User fields = ('email, 'phone_number') class PhoneSerializer(serializers.ModelSerializer): class Meta: Model = Phone fields = ('phone_number') 

El formulario html tendría un signo más en el campo de número de teléfono para indicar que se puede agregar un nuevo número de teléfono. el ejemplo está aquí

 email : admin@admin.com phone number: 23423432423 (add more) phone number: 3423423423 (add more) ... 

El esperado json

 { 'email': 'email@email.com', 'phone_number': '32432433223234' } 

o si se agregan muchos números de teléfono

 { 'email': 'email@email.com', 'phone_number': '32432433223234', 'phone_number': '324342322342323' } 

o tal vez

 { 'email': 'email@email.com', 'phone_number': ['32432433223234','324342322342323'] } 

o tal vez

 { 'email': 'email@email.com', 'Phone': [{'id': 1, 'phone_number': '32432433223234'}, {'id': 2, 'phone_number': '324342322342323'}] } 

es posible hacer esto json? ¿Cómo pueden el serializador y el modelviewset hacerlo? lo siento, soy totalmente nuevo en drf

  1. Versión por defecto para cualquier objeto nested.

Debe agregar los métodos de create y update serializador:

 class UserSerializer(serializers.ModelSerializer): phones = PhoneSerializer(required=False, many=True) class Meta: model = User fields = ('email', 'phone_number') def create(self, validated_data): phones_data = validated_data.pop('phones', []) user = super(UserSerializer, self).create(validated_data) for phone_data in phones_data: user.phone_set.create(phone_number=phone_data['phone_number']) return user def update(self, instance, validated_data): phones_data = validated_data.pop('phones', []) user = super(UserSerializer, self).update(instance, validated_data) # delete old user.phone_set.exclude(phone__in=[p['phone_number'] for p in phones_data]).delete() # create new for phone_data in phones_data: user.phone_set.get_or_create(phone_number=phone_data['phone_number']) return user 

Solicitud de creación:

 {"email": "test@example.com" "phones": [{"phone_number": 12}, {"phone_number": 123}]} 

Solicitud de actualización:

 {"phones": [{"phone_number": 22}]} 
  1. Optimización para la estructura actual:

ACTUALIZAR

  1. phones_data = validated_data.pop('phones') -> phones_data = validated_data.pop('phones', []) , para manejar el caso si no hay teléfonos solicitados.

  2. ¿Se deberían hacer las actualizaciones y la creación del teléfono en modelviewset?

    No, el serializador es responsable de la transformación de native data -> internal objects . Por lo tanto, si recibe datos de teléfonos, debe crear objetos PhoneNumber .