我正在尝试将 Pandas DataFrame 中的数据插入到使用 SQLite 后端的现有 Django 模型Agency
中。然而,按照 How to write a Pandas Dataframe to Django model 和 Saving a Pandas DataFrame to a Django Model 的解答会导致整个 SQLite 表被替换并破坏 Django 代码。具体来说,就是 Django 自动生成的id
主键列被index
替换,导致在渲染模板时发生错误(no such column: agency.id
)。
以下是在 SQLite 表agency
上使用 Pandas to_sql 的代码和结果。
在models.py
中:
class Agency(models.Model):
name = models.CharField(max_length=128)
在myapp/management/commands/populate.py
文件中:
class Command(BaseCommand):
def handle(self, *args, **options):
# Open ModelConnection
from django.conf import settings
database_name = settings.DATABASES['default']['NAME']
database_url = 'sqlite:///{}'.format(database_name)
engine = create_engine(database_url, echo=False)
# Insert data data
agencies = pd.DataFrame({"name": ["Agency 1", "Agency 2", "Agency 3"]})
agencies.to_sql("agency", con=engine, if_exists="replace")
成功运行 'python manage.py populate
' 命令会将三个机构添加到表中:
index name
0 Agency 1
1 Agency 2
2 Agency 3
然而,这样做已经改变了表的DDL:
CREATE TABLE "agency" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(128) NOT NULL)
致:
CREATE TABLE agency (
"index" BIGINT,
name TEXT
);
CREATE INDEX ix_agency_index ON agency ("index")
如何将DataFrame添加到Django管理的模型中并保持Django ORM不变?