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