【发布时间】:2021-05-02 12:51:32
【问题描述】:
我有两个模型,我想将所有数据从一个模型迁移到另一个模型。为了模拟问题,假设以下模型:
from django.db import models
class Book:
name = models.CharField(max_length=100)
is_archived = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
class BookArchived:
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
迁移的代码是:
book_objs = []
for archived_book in BookArchived.objects.all():
book_objs.append(Book(name=archived_book.name, is_archived=True, created_at=archived_book.created_at))
Book.objects.bulk_create(book_objs)
这段代码的问题在于,虽然我明确设置了created_at 字段(created_at=archived_book.created_at),但 Django 将所有这些字段都插入了当前时间。
我知道,如果明确设置了 pk 字段 (id=archived_book.id),新对象将保留原始时间戳。但是数据库中已经有重叠的ID,所以这种方法会产生另一个问题。如何保留 BookArchived 实例的原始 created_at 值?
【问题讨论】:
-
@blondelg:就是这样。
-
我不明白你为什么需要一个额外的模型。您有一个布尔值来确定
Bookis_archived是否为,因此您可以轻松提取已归档的书籍。 -
@WillemVanOnsem 它是旧模型。现在数据存在于两个不同的表中。这就是为什么我想将所有数据从
BookArchived迁移到Book,然后删除之前的模型。 -
@ElginCahangirov 您需要先从
Book模型迁移中删除auto_now_add=True,然后在另一个迁移中将其添加回来。auto_now_add隐式设置editable=False所以你不能自己设置它的值。 -
@AbdulAzizBarkat 对于生产环境来说是不可接受的解决方案。在部署时会有插入到预定表(
Book模型)