Как вызвать представление из самого себя в Django REST API?

В моем Django REST API есть функция, которая обрабатывает вставку продуктов. Иногда продукт будет вариативным продуктом (когда product.type = 3), в этом случае я получаю все перестановки этих вариаций и хочу вставить новый продукт, соответствующий каждой перестановке, в базу данных.

@api_view(['POST'])
def upsertProduct(request):
    productData = request.data['product']
    variations = productData.pop('variations', [])
    variationTypes = productData.pop('variationTypes', [])

    product, created = Product.objects.update_or_create(pk=productData['id'], defaults=productData)

    if (productData['type'].id == 3):
        variations_by_type = []
        for variationType in variationTypes:
            variations_by_type.append([variation for variation in variations if variation['variationType'] == variationType['id']])

        combinations = list(itertools.product(*variations_by_type))
        for combination in combinations:
            productData['name'] = product.name + ' (' + ' | '.join(' : '.join(i['name'] for i in item) for item in combination) + ')'
            productData['type'] = {'id': 5}
            productData['parent'] = product.id
            #Recursive call should go here
            #upsertProduct(request={'data': {'product': productData}})

Моя первая попытка заключалась в том, чтобы просто вызвать функцию, как я сделал в закомментированной строке. Django вернул следующее

AssertionError: Аргумент request должен быть экземпляром django.http.HttpRequest, а не builtins.dict.

Затем я попытался использовать этот объект HttpRequest из Django, но не могу понять, как правильно использовать его для этого случая. Я также пробовал использовать стандартную библиотеку request в Python, без успеха, и я также уверен, что это не было бы идеальным решением, даже если бы оно работало.

Любой совет по этому вопросу будет принят с благодарностью. Заранее спасибо!

В общем, я бы не стал создавать напрямую объект HttpRequest, который будет использоваться представлением где-то еще, потому что он содержит гораздо больше информации, чем данные полезной нагрузки, такие как информация о сессии, пользователе, промежуточном ПО, контексте и т.д.

Что вы можете сделать в своем коде, так это оставить единственную переменную request как есть и сделать другую функцию, которая обрабатывает словарь данных.

Например, если взять то, что вы написали, это даст что-то вроде:

def handle_data(productData):
    """
    Handle a dictionary of data 
    """
    product, created = Product.objects.update_or_create(pk=productData['id'], defaults=productData)
    return product
    

@api_view(['POST'])
def upsertProduct(request):
    productData = request.data['product']
    variations = productData.pop('variations', [])
    variationTypes = productData.pop('variationTypes', [])

    product = handle_data(productData)

    if (productData['type'].id == 3):
        variations_by_type = []
        for variationType in variationTypes:
            variations_by_type.append([variation for variation in variations if variation['variationType'] == variationType['id']])

        combinations = list(itertools.product(*variations_by_type))
        for combination in combinations:
            productData['name'] = product.name + ' (' + ' | '.join(' : '.join(i['name'] for i in item) for item in combination) + ')'
            productData['type'] = {'id': 5}
            productData['parent'] = product.id
            handle_data(productData)
Вернуться на верх