API запрос должен принимать объект пользователя в качестве входных данных и обновлять пользователя
Задача состоит в том, чтобы создать конечную точку API "/updateUser" для обновления информации о пользователе. Запрос API должен принимать объект User в качестве входных данных и обновлять пользователя.
Моя модель такова:
class UserModel(AbstractUser):
name = models.CharField(max_length=50)
email = models.EmailField(max_length=50, unique=True, primary_key=True)
phone = models.CharField(max_length=10, unique=True)
gender = models.CharField(max_length=10, null=True)
dob = models.DateField(null=True)
username = models.CharField(max_length=50, unique=True)
REQUIRED_FIELDS = []
Сериализатор является:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = UserModel
fields = ['id','name','username','email','phone','password']
extra_kwargs = {
'password': {'write_only': True}
}
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password !=None:
instance.set_password(password)
instance.save()
return instance
url is:
from django.urls import path
from . views import RegisterView, UpdateUserView
urlpatterns = [
path('register/', RegisterView.as_view()),
path('updateUser/', UpdateUserView.as_view())
]
Теперь, как создать представление для этого, которое принимает объект как вход и обновляет его?!
Я думаю сделать это так, вам нужно переопределить метод update для обработки обновления пользователя, это будет выглядеть следующим образом
def update(self, instance, validated_data):
"""Your code to handle it"""
return instance
Ваше представление должно наследоваться от UpdateAPIView (Здесь вы можете проверить документацию )
и затем в вашем url-файле вы должны сделать это следующим образом
urlpatterns = [
path('register/', RegisterView.as_view()),
path('updateUser/', UpdateUserView.as_view())
]
Чтобы сделать это без передачи id в пути url (так как это не безопасно само по себе, поэтому вам придется написать некоторый код для разрешения), вы должны переопределить функцию get_object следующим образом:
def get_object(self):
queryset = self.get_queryset()
obj = get_object_or_404(queryset, user=self.request.user)
return obj
Поступая таким образом, он становится безопасным.
Ps. """Ваш код для обработки""" - это код, который вы должны получить от пользователя и обновить его данные в зависимости от того, что вы хотите сделать.
Другой способ сделать это - создать представление на основе функций, но этот тоже работает.