Django REST:为OneToOne油田创建积垢操作

2024-04-23 15:05:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为OneToOne油田创建基本的积垢操作。 用户在登录时不需要设置配置文件。当需要时如何创建/更新/删除概要文件(假设用户已经在数据库中)?在

我的模型是Django REST的默认用户模型,并且:

class UserProfile(models.Model):
        user = models.OneToOneField(User)
        location = models.CharField(max_length=50,blank=True)
        title = models.CharField(max_length=80,blank=True)
        #picture = models.ImageField(upload_to='user_imgs', blank=True)
        website = models.URLField(blank=True)

我的视图集是:

^{pr2}$

并序列化:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        email = serializers.EmailField()
        fields = ('id','username', 'email', 'first_name', 'last_name')


class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    user_id = serializers.CharField(source='user.id')

    class Meta:
        model = UserProfile
        fields = ('user_id', 'location','title','website')

Tags: 用户模型idtruemodelslocationlengthmax
2条回答

我相信您希望将配置文件创建限制为当前登录的用户。您可以过滤当前用户的配置文件查询集,这样登录的用户只能访问该用户的配置文件。在

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_fields = ['id', 'username', 'email', 'first_name', 'last_name']


class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    filter_fields = ['user_id', 'location', 'title', 'website']

    def get_queryset(self):
        return super(UserProfileViewSet, self).get_queryset().filter(
            user=self.request.user)

    def perform_create(self, serializer):
        serializer.save(user=user)

您将user字段设为只读,并保存在上面的方法perform_create中,并始终分配给当前用户。在

^{pr2}$

它应该专注于定义view如何接收请求和处理原始数据,而不是字段定义的model和{}。在

我给您一个基本User操作的CRUD示例作为参考:

lu=LibraryUser(library_membership_number='…',user_id=user)

class ExampleAPIView(APIView):
    def get(self, request):
        username = request.query_params.get('username', '')
        user = User.objects.get(username=username)
        return Response(ExampleSerializer(user).data)

    def post(self, request):
        username = request.data.get('username', '')
        email = request.data.get('email', '')
        password = request.data.get('password', '')
        user = User.objects.create_user(username=username, email=email, password=password)
        user.save()
        Response({'status': 'ok'}})

    def put(self, request):
        username = request.data.get('username', '')
        old_password = request.data.get('old_password', '')
        new_password = request.data.get('new_password', '')
        user = authenticate(username=username, password=old_password)
        if not user:
            return Response({'status': 'fail'}})
        user.set_password(new_password)
        return Response({'status': 'ok'}})

    def delete(self, request):
        username = request.query_params.get('username', '')
        user.objects.get(username=username).delete()
        return Response({'status': 'ok'}})

根据示例,我对每种方法的定义如下:

  • GET:检索用户配置文件

  • POST:创建新用户

  • PUT:更改密码的用户

  • DELETE:删除用户

因此,它将为user实例实现基本的crudapi。在

我希望它能帮助你设计api。在


如果您还不知道如何操作model,我将详细介绍这个示例:

^{pr2}$

相关问题 更多 >