Django аргумент request должен быть экземпляром django.http.HttpRequest

Я импортирую сервис function из функции django views и получаю эту ошибку

'The `request` argument must be an instance of `django.http.HttpRequest`, not `collections.OrderedDict`.'

Я использовал ту же реализацию и в других модулях, и они работают нормально.

from custom_label.services.custom_label_svc import update_label

@api_view(["POST"])
@authorize
def update_label(request) -> JsonResponse:
    try:
        payload = ValidateUpdateLabel(data=request.data)
        if payload.is_valid():
            # call service methods
            data = update_label(payload.validated_data) << here

            ...

В custom_label > services > custom_label_svc.py файле:

from basic_files.database_connections import connect_to_postges

cursor = connect_to_postges()


def update_label(params: dict) -> dict:
    app_id = params.get('appid')
    label_name = params.get('label_name')
    updated_label_icon = params.get('updated_label_icon')

    sql = "UPDATE label SET icon = %s  WHERE appId = %s AND name = %s" % (updated_label_icon, app_id, label_name)
    cursor.execute(sql)

    return cursor.rowcount

Что я здесь упускаю?

Причина неудачи в том, что у вас есть две функции с одинаковыми именами, поэтому она вызовет update_label, которую вы определили в имени.

Вы можете исправить это, импортировав функцию с другим именем, так:

from custom_label.services.custom_label_svc import update_label as update_label_logic

@api_view(['POST'])
@authorize
def update_label(request) -> JsonResponse:
    try:
        payload = ValidateUpdateLabel(data=request.data)
        if payload.is_valid():
            # call service methods
            data = update_label_logic(payload.validated_data)
    # …

Но оборачивать всю логику в try-except обычно не хорошая идея. Более того, ваша функция уязвима для SQL-инъекций.

Вернуться на верх