You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:20:54