Используя мою создающую пользовательскую конечную точку, я хочу взять значение '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 )
Не стесняйтесь комментировать мой код или используемые решения:)
Спасибо за помощь!