Django: Почему я получаю сообщение An error occurred in the current transaction. Вы не можете выполнять запросы до конца блока 'atomic'.

Я бьюсь над этой проблемой уже несколько дней и, похоже, не могу приблизиться к решению.

В настоящее время у меня есть две модели. Модель PurchaseOrder (PO) и модель PurchaseOrderLine (POL). Модель POL имеет внешний ключ к PO.

Я загружаю CSV и, используя pandas, читаю каждую строку csv и разбираю ее соответствующим образом. Сначала он пытается выполнить PO.objects.get_or_create() на основе значений в строке.

Используя созданный PO, я выполняю некоторую логику и в итоге создаю экземпляр POL, который я хочу связать с ранее упомянутым экземпляром PO.

Однако, при создании POL, я получаю:

TransactionManagementError В текущей транзакции произошла ошибка. Вы не можете выполнять запросы до конца блока 'atomic'.

.

И я не понимаю, почему так происходит. У меня есть похожая логика в коде в других местах, например, создание заказа и последующее добавление OrderLines к этому заказу. Есть идеи, что я делаю неправильно?

Ниже приведен весь код (я удалил часть логики о значениях настроек и т.д.). Ошибка возникает в последнем блоке, где POL создается с помощью get_or_create().

@classmethod
def parse_purchase_order_from_csv(cls, purchase_file, store_id, supplier_id=0, field_mapping='', invoice_number='', create_product=False, scrape=False):
    # open the CSV file
    import pandas as pd

    #Some parsing of data here

    # remove empty lines
    df = df.dropna(how='all')
    lines = len(df)
    # open each row
    for row in df.itertuples():
        # Create Purchase Order.
        status = {
            'total_lines': lines,
            'lines_processed': 1,
            'lines_success': 0,
            'error_lines': []
        }

        # Some parsing

        po, po_created = cls.objects.get_or_create(
            internal_id=internal_id,
            supplier=supplier,
            store_id=store_id,
            defaults={
                'purchase_date': purchase_date,
                'status': status
            }
        )
        
        if po.completed:
            # already handled and closed
            continue

        # Here was some logic linking the POL to a product.

        if product:
            pol, pol_created = po.purchaseorderline_set.get_or_create(
                label=label,
                ean=row[ean_col + 1],
                purchase_order=po,
                defaults={
                    'amount': row[quantity_col + 1],
                    'label': label,
                    'product': product,
                    'ean': row[ean_col + 1],
                }
            )
            pol.save()
        else:
            pol, pol_created = po.purchaseorderline_set.get_or_create(
                label=label,
                ean=row[ean_col + 1],
                purchase_order=po,
                defaults={
                    'amount': row[quantity_col + 1],
                    'label': label,
                    'ean': row[ean_col + 1],
                }
            )
            pol.save()

        po.status['lines_success'] += 1
        po.save()
Вернуться на верх