Проверка типа аргумента в представлениях 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)
Вернуться на верх