【问题标题】:Django REST: create CRUD operations for OneToOne FieldDjango REST:为 OneToOne 字段创建 CRUD 操作
【发布时间】:2016-01-08 02:01:40
【问题描述】:

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

我的模型是来自 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)

我的视图集是:

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']

并序列化:

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')

【问题讨论】:

    标签: python django rest django-models django-rest-framework


    【解决方案1】:

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

    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 中保存并始终分配给当前用户。

    class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = UserProfile
            fields = ('user', 'location','title','website')
            read_only_fields = ('user',)
    

    【讨论】:

      【解决方案2】:

      应该重点定义view如何接收请求和处理原始数据,而不是字段定义的modelserializer

      我给你一个基本的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 实例实现基本 CRUD api。

      希望对你如何设计api有所帮​​助。


      如果你还不明白model的操作方法,我再多介绍例子:

      class ExampleAPIView(APIView):
          def get(self, request):
              username = request.query_params.get('username', '')
              userprofile = UserProfile.objects.get(user__username=username)
              return Response(ExampleSerializer(userprofile).data)
      
          def put(self, request):
              username = request.data.get('username', '')
              userprofile = UserProfile.objects.get(user__username=username)
              if not userprofile :
                  return Response({'status': 'fail'}})
              userprofile.location = ...
              userprofile.title = ...
              userprofile.website = ...
              userprofile.save()
              return Response({'status': 'ok'}})
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多