Итак, позвольте мне сначала кратко объяснить. У меня есть несколько DataFrames, которые я хочу сохранить как модель Django. Для этого я использую функцию Pandas to_sql, которая до сих пор работала у меня блестяще.
Так, например, у меня есть такая модель заказа:
class Order(models.Model):
id = models.BigIntegerField(primary_key=True)
item_id = models.CharField(max_length=255, null=True, blank=True)
ean = models.BigIntegerField(null=True, blank=True)
date = models.DateTimeField(null=True, blank=True)
Мой DataFrame имеет точно такие же столбцы, которые соответствуют полям модели Django. Поэтому я запускаю это, чтобы сохранить его в модели Django:
# Save to SQL
user = settings.DATABASES['default']['USER']
password = settings.DATABASES['default']['PASSWORD']
database_name = settings.DATABASES['default']['NAME']
database_url = 'postgresql://{user}:{password}@localhost:5432/{database_name}'.format(
user=user,
password=password,
database_name=database_name,
)
engine = create_engine(database_url, echo=False)
# Use replace for tables that already exist and set appropiate types with sqlalchemy | https://docs.sqlalchemy.org/en/13/core/type_basics.html#sql-standard-and-multiple-vendor-types
df_final.to_sql('orders_order', dtype={'id': sqlalchemy.types.BIGINT(),
'item_id': sqlalchemy.types.VARCHAR(),
'ean': sqlalchemy.types.BIGINT(),
'date': sqlalchemy.DateTime(),
},
con=engine, if_exists='replace', index=False)
Все хорошо, работает отлично. DataFrame сохраняется, и я могу просматривать все отдельные записи в Django Admin.
Однако я хотел бы сохранить DataFrame в модель Django, которая имеет отношение ForeignKey с моделью Orders. Поэтому, с моей точки зрения, я должен просто заполнить поля соответствующими данными.
Итак, для этой модели с ForeignKey для моей модели Order:
class Shipment(models.Model):
id = models.BigIntegerField(primary_key=True)
order_id = models.ForeignKey('orders.Order', null=True, blank=True, on_delete=models.SET_NULL)
Я использую эту функцию to_sql:
df_final.to_sql('shipments_shipment', dtype={'id': sqlalchemy.types.BIGINT(),
'order_id': sqlalchemy.types.BIGINT(),
}, con=engine, if_exists='replace', index=False)
Данные сохраняются, и при просмотре таблицы в postgres я вижу, что целые числа order_id сохраняются в базе данных.
Однако, когда я пытаюсь перейти в Django Admin и нажатьВ моей модели я получаю эту ошибку:
Internal Server Error: /admin/shipments/shipment/
Traceback (most recent call last):
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: column shipments_shipment.order_id_id does not exist
LINE 1: ...ipment"."reference", "shipments_shipment"."date", "shipments...
^
HINT: Perhaps you meant to reference the column "shipments_shipment.order_id".
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/contrib/admin/options.py", line 606, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/contrib/admin/sites.py", line 223, in inner
return view(request, *args, **kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/utils/decorators.py", line 45, in _wrapper
return bound_method(*args, **kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1790, in changelist_view
'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)},
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/models/query.py", line 256, in __len__
self._fetch_all()
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/models/query.py", line 1242, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/models/query.py", line 55, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1100, in execute_sql
cursor.execute(sql, params)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/backends/utils.py", line 99, in execute
return super().execute(sql, params)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/raf/Development/ehibol/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column shipments_shipment.order_id_id does not exist
LINE 1: ...ipment"."reference", "shipments_shipment"."date", "shipments...
^
HINT: Perhaps you meant to reference the column "shipments_shipment.order_id".
Итак, что-то явно не так с функцией to_sql и полем ForeignKey, потому что все остальные поля работали отлично.
Может кто-нибудь мне помочьиз