Django models pandas to_django中的sql:将外键插入数据库

Django models pandas to_django中的sql:将外键插入数据库,django-models,foreign-keys,django-database,django-postgresql,pandas-to-sql,Django Models,Foreign Keys,Django Database,Django Postgresql,Pandas To Sql,使用pandas to_sql函数时,是否有插入外键的方法? 在将熊猫添加到数据库(postgres)之前,我正在与django的熊猫一起处理上传的Consultations(n=40k)。我一排一排地做,但那需要15到20分钟。这比我希望我的用户等待的时间要长,所以我正在寻找一个更有效的解决方案 我尝试使用pandas\u sql,但在调用to\u sql函数之前,我不知道如何将两个外键关系作为列添加到我的协商数据帧中。是否有方法将Patient和Praktijk外键添加为咨询数据框中的一列

使用pandas to_sql函数时,是否有插入外键的方法?

在将熊猫添加到数据库(postgres)之前,我正在与django的熊猫一起处理上传的
Consultation
s(n=40k)。我一排一排地做,但那需要15到20分钟。这比我希望我的用户等待的时间要长,所以我正在寻找一个更有效的解决方案

我尝试使用pandas\u sql,但在调用
to\u sql
函数之前,我不知道如何将两个外键关系作为列添加到我的
协商
数据帧中。是否有方法将Patient和Praktijk外键添加为
咨询
数据框中的一列

更具体地说,当逐行插入时,在数据库中创建新的咨询时,我使用类型的对象
Patient
Praktijk
。但是,在数据帧中,我无法使用这些类型,因此不知道如何正确添加外键。是否可能存在类型为
object
int
(患者id)的值,该值可以替换类型为patient的值,从而设置外键

咨询
模式:

class Consultation(models.Model):
    # the foreign keys
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE, null=True, blank=True)
    praktijk = models.ForeignKey(Praktijk, on_delete=models.CASCADE, default='')

    # other fields which do not give trouble with to_sql
    patient_nr = models.IntegerField(blank=True, null=True)
    # etc
to_sql
调用:

consultations.to_sql(Consult._meta.db_table, engine, if_exists='append', index=False, chunksize=10000)


如果上述方法不可行,还有其他更有效的解决方案吗?

我也有同样的问题,我就是这样解决的。我的回答不那么直截了当,但我相信它会有所帮助

检查您的django项目以确保两件事:

  • 目标表名
  • 表列名称
  • 在我的例子中,我在定义django模型时使用
    类Meta
    来使用显式名称(django有一种自动命名表的方法)。我将用它来说明

    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
        class Meta:
            db_table = "poll_questions"
    
    class Choice(models.Model):
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        choice_text = models.CharField(max_length=200)
        votes = models.IntegerField(default=0)
        class Meta:
            db_table = "question_choices"
    
    注意:Django使用问题对象的pk引用数据库中的问题外键

    假设我有一个问题pk 1和一个数据框df,我希望用它更新问题选项如果使用pandas批量插入数据库,我的df必须如下所示

    import pandas as pd  
    
    df = pd.DataFrame(
        {
            "question": [1, 1, 1, 1, 1],
            "choice_text": [
                "First Question",
                "Second Question",
                "Third Question",
                "Fourth Question",
                "Fifth Question"
            ],
            "votes":[5,3,10,1,13]
        }
    )
    
    
    我希望我能把df写成一个表。太糟糕了,所以不支持表的常规降价

    尽管如此,我们仍有自己的df,下一步是创建用于插入记录的数据库连接

    from django.conf import settings
    from sqlalchemy import create_engine
    
    # load database settings from django
    
    user = settings.DATABASES['default']['USER']
    passwd = settings.DATABASES['default']['PASSWORD']
    dbname = settings.DATABASES['default']['NAME']
    
    # create database connection string
    conn = 'postgresql://{user}:{passwd}@localhost:5432/{dbname}'.format(
        user=user,
        passwd=passwd,
        dbname=dbname
    )
    
    # actual database connection object.
    conn = create_engine(conn, echo=False)
    
    # write df into db
    df.to_sql("question_choices", con=conn, if_exists="append", index=False, chunksize=500, method="multi")
    
    

    我们完了

    注:
    然而,django支持的并不是您所要求的