Django rest framework Django rest框架-在筛选时引发异常/处理空结果

Django rest framework Django rest框架-在筛选时引发异常/处理空结果,django-rest-framework,Django Rest Framework,我有一个用户配置文件类,正在检查用户是否存在,是否不想创建该用户 我使用userprofile的筛选器类,以便客户端可以调用: 如果结果为空,则将创建具有电子邮件地址的用户 是否有方法截获查询结果并在其为空时引发异常,并处理该异常以创建用户。 如果有更好的方法,我也希望得到纠正 class UserQueryFilter(django_filters.rest_framework.FilterSet): email = django_filters.CharFilter(name="u

我有一个用户配置文件类,正在检查用户是否存在,是否不想创建该用户

我使用userprofile的筛选器类,以便客户端可以调用:

如果结果为空,则将创建具有电子邮件地址的用户

是否有方法截获查询结果并在其为空时引发异常,并处理该异常以创建用户。 如果有更好的方法,我也希望得到纠正

class UserQueryFilter(django_filters.rest_framework.FilterSet):
    email = django_filters.CharFilter(name="user__email")
    username = django_filters.CharFilter(name="user__username")

    class Meta:
        model = UserProfile
        fields = ['email', 'username']


class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserSerializer
    filter_class = UserQueryFilter
感谢您的帮助

谢谢
Anand

Django Rest框架提供了默认禁用的功能。也许它可以为您提供另一种解决问题的方法:

另一方面,如果您确实需要通过带有querystring的GET请求创建用户,则可以使用django过滤器中的
MethodFilter
,例如:

class UserFilters(FilterSet):
    user = MethodFilter(action='filter_user')

    class Meta:
        model = User
        fields = ['user']

    def filter_user(self, queryset, value):
        if not value:
            # Here Raise Exception
        else:
            # Check if the user exists, if not create it
            users = queryset.filter(Q(username=value) | Q(email=value))
            if not users.exists:
                user = User.objects.create(...)
                return queryset.filter(pk=user.id)
            else:
                return users
希望这能帮助你。我不太确定它是否能以那种确切的方式工作,但这是一个想法

就个人而言,我建议您尝试通过更合适的请求(如POST或PUT)来执行该任务,并在相应的方法中进行管理