如何在Django中通过Python将PostgreSQL表的ID列数据导入另一表
Django中实现跨表ID插入的方案
先确认你已经在models.py里正确定义了对应数据库表的模型,示例如下(替换成你的实际表名和字段):
from django.db import models # 源表(包含ID和Value字段) class SourceTable(models.Model): id = models.AutoField(primary_key=True) value = models.CharField(max_length=255) class Meta: db_table = 'your_source_table_name' # 替换为实际表名 managed = False # 如果是已有数据库表,加这个避免Django自动修改表结构 # 目标表(包含value_id字段) class TargetTable(models.Model): value_id = models.IntegerField() # 若要建立关联,可换成ForeignKey(SourceTable, on_delete=models.CASCADE) # 其他字段... class Meta: db_table = 'your_target_table_name' managed = False
方法一:ORM常规插入(适合单条/少量数据)
对应你之前的子查询插入逻辑,用ORM实现的写法如下:
# 先根据条件获取源表的ID source_id = SourceTable.objects.filter(value='匹配值').values_list('id', flat=True).first() # 确认拿到ID后插入目标表 if source_id: TargetTable.objects.create(value_id=source_id)
如果要同时插入多个关联ID(比如你原代码里的LT_ID_ONE和LT_ID_TWO):
lt_num_one = df1.iloc[0, 0] lt_num_two = df1.iloc[0, 1] # 从两张源表获取对应ID id_one = SourceTable1.objects.filter(LT_NUM_ONE=lt_num_one).values_list('LT_ID_ONE', flat=True).first() id_two = SourceTable2.objects.filter(LT_NUM_TWO=lt_num_two).values_list('LT_ID_TWO', flat=True).first() if id_one and id_two: TargetTable.objects.create(LT_ID_ONE=id_one, LT_ID_TWO=id_two)
方法二:批量插入(适合大量数据)
如果要把源表所有ID批量导入目标表的value_id字段,用bulk_create效率更高:
# 获取源表所有ID source_ids = SourceTable.objects.values_list('id', flat=True) # 构造目标表对象列表 target_objects = [TargetTable(value_id=sid) for sid in source_ids] # 批量插入 TargetTable.objects.bulk_create(target_objects)
方法三:Django原生SQL(贴近你原来的写法)
如果更习惯写原生SQL,Django可以通过自带的数据库连接执行:
from django.db import connection lt_num_one = df1.iloc[0, 0] lt_num_two = df1.iloc[0, 1] with connection.cursor() as cur: db_insert = """INSERT INTO "Database"."TABLE_ONE" ("LT_ID_ONE", "LT_ID_TWO") VALUES( (SELECT "LT_ID_ONE" FROM "Database"."TABLE_TWO" WHERE "LT_NUM_ONE" = %s), (SELECT "LT_ID_TWO" FROM "Database"."TABLE_THREE" WHERE "LT_NUM_TWO" = %s) );""" cur.execute(db_insert, [lt_num_one, lt_num_two]) # 如需保证事务一致性,可用from django.db import transaction,用transaction.atomic()包裹操作
额外提示
- 如果字段是关联关系,建议用
ForeignKey代替IntegerField,Django会自动维护外键约束,避免脏数据。 - 重要操作建议用事务包裹,防止数据插入失败导致的不一致问题。
内容的提问来源于stack exchange,提问作者Flint_Lockwood
相关产品推荐
相关产品推荐

