【问题标题】:Conditional statements in DRF CreateAPIViewDRF CreateAPIView 中的条件语句
【发布时间】:2015-12-10 16:32:20
【问题描述】:

我想根据特定条件限制用户可以将图片上传到哪些类别。在下面的代码中,我可以在网站上做我想做的事情。

class PhotoUploadForm(forms.ModelForm):
    class Meta:
        model = Photo
        fields = ('photo', 'category')

    def __init__(self, *args, **kwargs):
        if not hasattr(self, 'request'):
            self.request = kwargs.pop('request')

        super(PhotoUploadForm, self).__init__(*args, **kwargs)

        if not self.request.user.edu_email:
            self.fields['category'].queryset = Category.objects.exclude(
                title='University')

但是,我不知道如何在 Django Rest 框架中模仿这一点以在我的 API 中使用。有人会碰巧知道怎么做吗?

提前谢谢你!

序列化器:

class PhotoCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
        fields = [
            'creator',
            'photo',
            'category',
        ]

查看:

class PhotoCreateAPIView(generics.CreateAPIView):
    serializer_class = PhotoCreateSerializer

【问题讨论】:

    标签: django serialization django-forms django-views django-rest-framework


    【解决方案1】:

    DRF 提供permission_classes 来限制特定用户。

    permission.py

    from rest_framework.permissions import IsAuthenticated
    
    class PhotoUploadPermissions(IsAuthenticated):
        """ write custom permissions here"""
        def has_permission(self, request, view):
            if not request.user.edu_email:
                queryset = view.get_queryset()
                category_exclude = queryset.exclude(title='University')
                if category_exclude:
                    return True
                else:
                   return False
    

    viewsets.py

    class PhotoCreateAPIView(viewsets.ModelViewSet):
        queryset = Category.objects.all()
        permission_classes = (PhotoUploadPermissions,)
        serializer_class = PhotoCreateSerializer
    

    【讨论】:

      【解决方案2】:

      将此添加到您的 PhotoCreateAPIView

      def get_queryset(self):
          if not self.request.user.edu_email:
               return Category.objects.exclude(
                  title='University')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-23
        • 2015-03-04
        • 2019-08-27
        • 2011-01-20
        相关资源
        最近更新 更多