Как вызвать представление из самого себя в 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)