首页 > 解决方案 > 如何避免 2 个相等的循环 | 姜戈

问题描述

我得到了这个代码:

    i = 1
    for item in cart:
        data_ps[f"itemId{i}"] = item
        data_ps[f"itemDescription{i}"] = item.category.name
        data_ps[f"itemAmount{i}"] = item.sell_price
        data_ps[f"itemQuantity{i}"] = '1'
        i += 1

    total_value = format(((shipping_price + cart_price) / installment), '.2f')
    data_ps['installmentValue'] = total_value

    response = requests.post('https://ws.sandbox.pagseguro.uol.com.br/v2/transactions', headers=headers,
                             params=params, data=data_ps)

    if response.status_code == 200:
        for item in cart:
            Sell.objects.create(item=item,
                                date=timezone.now(),
                                discount=Decimal(0.00),
                                total_paid=cart.get_total_price(),
                                buyer=request.user, )

如您所见,有 2 个for item in cart循环。在第一个之后,我需要获取一个 request.post 然后检查 status_code 是否等于 200。如果是,则代码会生成另一个for item in cart循环。

我想知道是否有办法避免第二次循环在第一个循环中添加所有这些信息,因为它只是更新我数据库中的一条记录('Sell.objects.create')。

任何想法?

谢谢

标签: pythondjangodatabaseloops

解决方案


您可以为您的Sell模型添加一个值cart。你可以这样做:

total_value = format(((shipping_price + cart_price) / installment), '.2f')
data_ps['installmentValue'] = total_value

i = 1
for item in cart:
    data_ps[f"itemId{i}"] = item
    data_ps[f"itemDescription{i}"] = item.category.name
    data_ps[f"itemAmount{i}"] = item.sell_price
    data_ps[f"itemQuantity{i}"] = '1'
    Sell.objects.create(
        item=item,
        date=timezone.now(),
        discount=Decimal(0.00),
        total_paid=cart.get_total_price(),
        buyer=request.user,
        cart=cart,  # <= ---------- New ----------
    )
    i += 1


url = 'https://ws.sandbox.pagseguro.uol.com.br/v2/transactions'
response = requests.post(url, headers=headers, params=params, data=data_ps)

if response.status_code != 200:
    Sell.objects.filter(cart=cart).delete()
        

从技术上讲,使用这种方法,您不会for从逻辑中删除循环;您只是将它移动到数据库查询中。所以这是一个权衡。响应是否status_code等于200大多数时间?还是大部分时间都失败了?你应该在这个权衡中做出决定。


推荐阅读