【问题标题】:API request should take User Object as input and update the userAPI 请求应将用户对象作为输入并更新用户
【发布时间】:2022-01-23 22:50:40
【问题描述】:

任务是创建一个 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

网址是:

from django.urls import path
from . views import RegisterView, UpdateUserView
urlpatterns = [
    path('register/', RegisterView.as_view()),
    path('updateUser/', UpdateUserView.as_view())
]

现在,如何为此创建以对象为输入的视图并更新它?!

【问题讨论】:

  • 请附上您的视图文件:)

标签: python django rest django-rest-framework


【解决方案1】:

我认为这样,你必须重写update方法来处理用户的更新,它看起来像这样

 def update(self, instance, validated_data):
     """Your code to handle it"""
     return instance

你的视图应该继承自UpdateAPIView(你可以在这里查看the docs) 然后在你的 url 文件中你应该这样做

urlpatterns = [
    path('register/', RegisterView.as_view()),
    path('updateUser/', UpdateUserView.as_view())
]

要在不传递 url 路径中的 id 的情况下执行此操作(因为它本身并不安全,因此您必须编写一些代码以获得权限),您必须像这样覆盖 get_object 函数:

def get_object(self):
  queryset = self.get_queryset()
  obj = get_object_or_404(queryset, user=self.request.user)
  return obj

这样做是安全的。

附言。 """您的处理代码""" 是您必须获取用户并根据您想要执行的操作更新其数据的代码。

另一种方法是创建一些基于函数的视图,但这个也可以。

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2011-08-07
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多