# How to update User Profile and User in one request in Django Rest Framework?

***Note: If you are looking for a Full Stack Developer (Django+React), then connect with me on*** [***LinkedIn***](https://www.linkedin.com/in/mnamegaurav/) ***or contact me through my*** [***portfolio***](https://gaurav.devjunction.in/)***.***

Let’s say you have a **Django** `User` model and a `UserProfile` model connected via `OneToOneField` . Your goal is to `serialize` both the **models** together in a single **request** to perform needed **CRUD** operations.

**Note:** I am not assuming whether you have a custom `User` **model** or provided by **Django,** this blog’s code will work with both custom and **Django’s** `User` **model**.

Let’s say your `UserProfile` model looks something like this:

```python
class UserProfile(models.Model):
	user = models.OneToOneField(User, related_name='userprofile', on_delete=models.CASCADE)
	# custom fields for userprofile
	mobile = models.CharField(max_length=50)
	#...
```

Let’s create a `serializer` for our `UserProfile` & `User` model in our `[serializers.py](http://serializers.py)` file (inside our **Django** app):

```python
from django.contrib.auth import get_user_model
from rest_framework import serializers
from accounts.models import UserProfile

User = get_user_model()

class UserProfileSerializer(serializers.ModelSerializer):
	class Meta:
		model = UserProfile
		fields = ('mobile',)

class UserSerializer(serializers.ModelSerializer):
	profile = UserProfileSerializer(source="userprofile", many=False)

	class Meta:
		model = User
		fields = ('username', 'email', 'first_name', 'last_name', 'profile')
		
		# Custom .update() method for serializer to handle UserProfile data update
		def update(self, instance, validated_data):
			userprofile_serializer = self.fields['profile']
			userprofile_instance = instance.userprofile
			userprofile_data = validated_data.pop('userprofile', {})
			
			# to access the UserProfile fields in here
			# mobile = userprofile_data.get('mobile')
			
			# update the userprofile fields
			userprofile_serializer.update(userprofile_instance, userprofile_data)
			
			instance = super().update(instance, validated_data)
			return instance
```

This is it, now we can create our `APIView` to perform **CRUD** operations:

```python
from django.contrib.auth import get_user_model
from rest_framework.generics import RetrieveUpdateAPIView
from rest_framework.permissions import IsAuthenticated
from accounts.serializers import UserSerializer

User = get_user_model()

class UserAPIView(RetrieveUpdateAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    permission_classes = (IsAuthenticated,)

    def get_object(self):
        return self.request.user
```

Any doubts? Write it down in the comments.

> ***For more such crispy blogs daily, follow Dev.Junction, subscribe to our newsletter and get notified.***

## Social Links

* **LinkedIn:** [https://www.linkedin.com/in/mnamegaurav/](https://www.linkedin.com/in/mnamegaurav/)
    
* **YouTube:** [https://www.youtube.com/c/devjunction](https://www.youtube.com/c/devjunction)
    
* **Website:** [https://gaurav.devjunction.in/](https://gaurav.devjunction.in/)
    
* **GitHub:** [https://github.com/mnamegaurav](https://github.com/mnamegaurav)
    
* **Instagram:** [https://www.instagram.com/mnamegaurav/](https://www.instagram.com/mnamegaurav/)
    
* **Twitter:** [https://twitter.com/mnamegaurav](https://twitter.com/mnamegaurav)
