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

如何在Django中为Logs表设置ticket_no+updated_on复合主键并移除默认id

实现Django中排除默认id字段并以复合主键复制表数据的方案

一、调整Logs表的模型定义

Django默认会自动生成id自增主键字段,要实现ticket_no和updated_on作为复合主键(Django原生不支持多字段主键,这里用联合唯一约束模拟),需要修改Logs模型:

from django.db import models

class Logs(models.Model):
    # 与Tickets表完全一致的字段,无需手动声明id字段
    ticket_no = models.CharField(max_length=50)
    updated_on = models.DateTimeField()
    # 其他字段(和Tickets表保持完全一致)
    # example_field = models.CharField(max_length=100)

    class Meta:
        db_table = 'logs'
        # 设置ticket_no与updated_on的联合唯一约束,模拟复合主键
        constraints = [
            models.UniqueConstraint(fields=['ticket_no', 'updated_on'], name='unique_ticket_updated')
        ]
        # 若使用Django 3.2以下版本,改用unique_together:
        # unique_together = ('ticket_no', 'updated_on')

如果Logs表已存在,执行迁移命令更新表结构:

python manage.py makemigrations
python manage.py migrate

二、数据复制的实现方式

方法1:批量复制(高效,适合大数据量)

通过values()指定需要复制的字段(排除id),批量生成Logs对象并插入:

# 提取Tickets表中需要的字段数据,排除id
ticket_data = Tickets.objects.all().values(
    'ticket_no', 'updated_on', 
    # 列出其他需要复制的字段
    # 'example_field'
)

# 转换为Logs对象列表
logs_objects = [Logs(**item) for item in ticket_data]

# 批量插入,ignore_conflicts=True可跳过已存在的复合主键记录(仅PostgreSQL 9.5+支持)
Logs.objects.bulk_create(logs_objects, ignore_conflicts=True)

方法2:单条处理(适合小数据量,支持存在则更新)

使用update_or_create,基于复合主键判断记录是否存在,不存在则插入,存在则更新字段:

for ticket in Tickets.objects.all():
    Logs.objects.update_or_create(
        # 复合主键作为匹配条件
        ticket_no=ticket.ticket_no,
        updated_on=ticket.updated_on,
        # 需要更新/插入的其他字段
        defaults={
            # 'example_field': ticket.example_field,
            # 其他字段...
        }
    )

注意事项

  • 确保Tickets和Logs表的字段(除id外)完全一致,包括字段类型、长度等,避免插入时出现字段不匹配错误。
  • 若使用ignore_conflicts=True,需确认数据库支持该特性(如MySQL需用ON DUPLICATE KEY UPDATE替代,可通过自定义SQL实现)。

内容的提问来源于stack exchange,提问作者user13726864

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:18:57