Проверка типа аргумента в представлениях Django Python
У меня больше опыта с C (промежуточный опыт) и сейчас работаю над чем-то на Django Python.
У меня есть функция url, которая направляет REST-вызов на функцию views. Теперь я пытаюсь сделать единый url для передачи аргумента для ID (int) и email (str/EmailField), чтобы приземлиться на ту же функцию views, и я мог затем распаковать тип переданного аргумента и сделать что-то другое.
Я хочу, чтобы url не зависел от типа аргумента, а затем выполнял условную проверку в функции views. Но похоже, что каждый раз аргумент отправляется как str (даже когда отправляется id).
Мне кажется, что здесь есть две вещи, которые я не до конца понимаю: возможно, аргумент всегда будет передаваться в функцию view как str? Или может быть проблема с моей проверкой типа (как вы можете видеть, я пытаюсь привести тип аргумента и проверить, истинен ли он. Кажется, что это больше похоже на метод языка C?
Спасибо!
urls.py выглядит как
path('<arg>/', views.getUpdateDeleteAccount), ->> this is what I am trying to do
#path('<int:pk>/', views.getUpdateDeleteAccount), ->>> works in isolation
#path('<str:email>/', views.getUpdateDeleteAccount), -->>> works in isolation
view.py выглядит как
@api_view(['GET', 'PUT', 'DELETE'])
def getUpdateDeleteAccount(request, arg):
if type(int(arg)) is int:
print("account id search, arg type is ")
print(type(arg))
try:
account = Account.objects.get(id=arg)
except Account.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
elif type(EmailField(arg)) is EmailField:
print("email add search, arg type is ")
print(type(arg))
try:
account = Account.objects.get(emailAddress=arg)
except Account.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
Кажется, теперь работает.
Но с тех пор я понял несколько вещей. EmailField, вероятно, даже не является допустимым типом Python для начала!
Во-вторых, я исправил проверку типов (которая, вероятно, была неправильной в первую очередь).
Наконец, изменил url.py так, чтобы теперь он выглядел следующим образом:
urls.py
path('<int:arg>/', views.getUpdateDeleteAccount),
path('<str:arg>/', views.getUpdateDeleteAccount),
views.py
def getUpdateDeleteAccount(request, arg):
"""To get, update and delete a single user account"""
if type(arg) is int:
try:
account = Account.objects.get(id=arg)
except Account.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
elif type(arg) is str:
try:
account = Account.objects.get(emailAddress=arg)
except Account.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)