Сохранение столбца Pandas DataFrame в поле модели ForeignKey Django - PullRequest
0 голосов
/ 10 ноября 2019

Итак, позвольте мне сначала кратко объяснить. У меня есть несколько 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, потому что все остальные поля работали отлично.

Может кто-нибудь мне помочьиз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...