如何在Django中将两个模型的表数据合并为一个模型(表)
合并Django关联模型为新表的实现方案
1. 创建整合所有字段的新模型
直接把两个原模型的所有字段合并到新模型中,去掉外键关联,保留每个字段的原有属性(如字段类型、null=True等):
class CombinedLocationData(models.Model): # 来自NewJsonData的字段 speed = models.IntegerField() heading = models.IntegerField() altitude = models.FloatField() accuracy = models.FloatField() longitude = models.FloatField() altitudeAccuracy = models.FloatField(null=True) latitude = models.FloatField() # 来自NewApiJsonData的字段 _id = models.CharField(null=True, max_length=100) mocked = models.BooleanField() timestamp = models.FloatField() _v = models.IntegerField(null=True) createdAt = models.CharField(null=True, max_length=100) updatedAt = models.CharField(null=True, max_length=100)
2. 迁移现有数据到新表
如果需要把旧表的已有数据迁移过来,按以下步骤操作:
- 执行命令生成空的迁移文件:
python manage.py makemigrations --empty yourappname
- 打开生成的迁移文件,修改
operations部分,添加数据迁移逻辑:
from django.db import migrations def migrate_old_data(apps, schema_editor): # 获取旧模型 NewJsonData = apps.get_model('yourappname', 'NewJsonData') NewApiJsonData = apps.get_model('yourappname', 'NewApiJsonData') # 获取新模型 CombinedLocationData = apps.get_model('yourappname', 'CombinedLocationData') # 遍历所有NewApiJsonData记录,关联对应的NewJsonData后插入新表 for api_data in NewApiJsonData.objects.all(): if api_data.coords: CombinedLocationData.objects.create( # 复制NewJsonData的字段 speed=api_data.coords.speed, heading=api_data.coords.heading, altitude=api_data.coords.altitude, accuracy=api_data.coords.accuracy, longitude=api_data.coords.longitude, altitudeAccuracy=api_data.coords.altitudeAccuracy, latitude=api_data.coords.latitude, # 复制NewApiJsonData的字段 _id=api_data._id, mocked=api_data.mocked, timestamp=api_data.timestamp, _v=api_data._v, createdAt=api_data.createdAt, updatedAt=api_data.updatedAt ) class Migration(migrations.Migration): dependencies = [ ('yourappname', '00xx_your_previous_migration'), # 替换为实际的依赖迁移编号 ('yourappname', '00xx_combinedlocationdata'), # 替换为新模型对应的迁移编号 ] operations = [ migrations.RunPython(migrate_old_data), ]
- 执行迁移命令完成数据同步:
python manage.py migrate
注意:替换代码中的yourappname为你的实际应用名称,迁移编号也要对应实际生成的编号。
内容的提问来源于stack exchange,提问作者zoro
相关产品推荐
相关产品推荐

