Próbuję wstawić dane w Pandas DataFrame do istniejącego modelu Django, Agency
, który używa backendu SQLite. Jednak następujące odpowiedzi na How to write a Pandas Dataframe to Django model i Saving a Pandas DataFrame to a Django Model prowadzą do zastąpienia całej tabeli SQLite i złamania kodu Django. W szczególności jest to automatycznie generowana kolumna klucza Django id
, która jest zastępowana przez index
, która powoduje błędy podczas renderowania szablonów (no such column: agency.id
).Jak napisać pandasową ramkę danych do istniejącego modelu Django?
Oto kod i wynik użycia Pandas to_sql w tabeli SQLite, agency
.
W models.py
:
class Agency(models.Model):
name = models.CharField(max_length=128)
W 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")
Wywoływanie 'python manage.py populate
' skutecznie dodaje trzech agencji w tabeli:
index name
0 Agency 1
1 Agency 2
2 Agency 3
Jednak ten sposób nie zmieniło DDL tabeli z:
CREATE TABLE "agency" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(128) NOT NULL)
do:
CREATE TABLE agency (
"index" BIGINT,
name TEXT
);
CREATE INDEX ix_agency_index ON agency ("index")
Jak mogę dodać DataFrame do modelu zarządzanego przez Django i zachować Django ORM nienaruszone?