Джанго: Почему я получаю сообщение об ошибке, возникшей в текущей транзакции. Вы не можете выполнять запросы до конца «атомарного» блока

#django #django-models

Вопрос:

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

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

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

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

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

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

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

Смотрите ниже весь соответствующий код (я удалил некоторую логику о значениях настроек и т. Д.). Ошибка возникает в последнем блоке, где 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()