Django REST Framework - сохранение телефона с префиксом страны в базе данных - PullRequest
0 голосов
/ 16 марта 2020

Используя мою создающую пользовательскую конечную точку, я хочу взять значение 'phone' из запроса и добавить его с кодом страны звонка перед этим. Данные запроса предоставляют мне код страны , который является внешним ключом для Страна модель.

Пример тела запроса:

{
    ...
    'phone':'000111222',
    'country':'616',
}

В этом случае '616' - это код страны Польши.

Я делаю следующее, чтобы реализовать все мои логики c в моем методе UserViewSet create():

class UserViewSet(ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()

    def create(self, request, format=None):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            # collecting country
            country_code = request.data['country']
            country = Country.objects.get(code=country_code)

            # setting dial code before phone
            dial_code = country.calling_code #'48'
            phone = dial_code + request.data['phone'] #'48000111222'

            # checking if final phone number already exists in database
            if User.objects.filter(phone=phone).exists():
                return Response({'phone': 'Phone number already exists.'}, status=status.HTTP_400_BAD_REQUEST)

            serializer.save(country=country, phone=phone)

            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Код работает, но пока У меня есть несколько проблем.

UserSerializer фактически проверяет мои поля, прежде чем моя create функция делает. Он использует необработанное значение телефона для проверки уникальности в базе данных - в этом случае 000111222 вместо 48000111222, что может вызвать нежелательную ошибку.

Мое решение кажется мне слишком сложным, может любой из встроенные функции помогают?

Если нет, то было бы неплохо отключить уникальность телефона в модели и оставить только мою собственную проверку?

Должны ли вещи вроде этого тип проверки должен быть включен в метод create или, скорее, проверка UserSerializer? (https://www.django-rest-framework.org/api-guide/validators/#writing -custom-validators )

Не стесняйтесь комментировать мой код или используемые решения:)

Спасибо за помощь!

...