簡體   English   中英

如何在 Django REST API 中從自身內部調用視圖?

[英]How to call a view from within itself in a Django REST API?

我在我的 Django REST ZDB974238714CA8DE634A7CE1DZ08 產品中有這個 function。 有時產品將是變體產品(當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}})

我的第一次嘗試是像在注釋行中所做的那樣簡單地調用 function。 Django 返回以下內容

AssertionError: request參數必須是django.http.HttpRequest的實例,而不是builtins.dict

然后我嘗試從 Django 使用這個 HttpRequest object,但無法弄清楚如何在這個用例中正確使用它。 我還嘗試了 Python 中的標准請求庫,但沒有成功,我也很確定即使它確實有效,這也不是一個理想的解決方案。

一般來說,我不會直接創建一個HttpRequest object以供其他地方的視圖使用,因為它包含比有效負載數據更多的信息,例如 session、用戶、中間件、上下文信息等。

您可以在代碼中執行的操作是保持單個request變量不變,並創建另一個處理數據字典的 function。

例如,以您寫的內容為例,這將給出如下內容:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM