如何在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返回了以下

断言错误:request参数必须是的实例django.http.HttpRequest而不是builtins.dict

然后我尝试使用Django中的这个HttpRequest对象,但不知道如何在这个用例中正确使用它。我还尝试过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)

最新更新