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()