Как получить результаты только по первичному ключу, а не все результаты в django-rest-framework?

#python #django #rest #django-rest-framework #django-rest-knox

#python #django #rest #django-rest-framework #django-rest-knox

Вопрос:

В моем приложении django мне нужно проверить, существует ли пользователь, используя номер телефона. Вход в систему осуществляется с использованием номера телефона и OTP. Я могу проверить, существует ли пользователь, с помощью запроса get на

 "/api/profiles/<primary key here>/".
  

Однако, если я запрошу

 "/api/profiles/"
  

я получаю список всех пользователей в базе данных.

Мне нужно, чтобы мое приложение ничего не возвращало при запросе

 "/api/profiles/"
  

и данные пользователя при запросе

 "/api/profiles/<primary key here>/"
  

Как мне это сделать?

Сериализатор — это сериализатор базовой модели

 
class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = [
            "id",
            "is_superuser",
            "fullname",
            "email",
            "is_staff",
            "is_active",
            # "birthdate",
            "phone_number",
            "created_at",
            "updated_at",
        ]

  

URL-адреса:

 
router = routers.DefaultRouter()
router.register(r"profiles", views.UserProfileViewSet)


urlpatterns = [
    path("admin", admin.site.urls),
    path("restauth/", include("rest_framework.urls", namespace="restauth")),
    path("api/", include(router.urls)),

  

число просмотров:

 class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
  

Комментарии:

1. можете ли вы опубликовать свой код

2. добавлен сериализатор, представления и URL-код

Ответ №1:

Можете ли вы попробовать этот код

 from rest_framework import mixins

class UserProfileViewSet(viewsets.ViewSet, mixins.RetrieveModelMixin):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
  

Ответ №2:

Я не смог найти никаких ответов, делающих это с помощью сериализаторов. Итак, я создал представление на основе функций, которое принимало номер телефона, используя form-data, и обновлял пароль как случайный 6-значный otp каждый раз, когда был сделан запрос и пользователь существовал.

Проверка пользователя:

 try:
    UserProfiles.objects.get(phone_number=request.POST["phone_number"]
    # generate otp
    return HttpResponse(otp)
except:
    return HttpResponse("user not found")