Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 从某个时间点更改数据库,如果更改不成功';无法拟合现有数据_Database_Django_Database Design - Fatal编程技术网

Database 从某个时间点更改数据库,如果更改不成功';无法拟合现有数据

Database 从某个时间点更改数据库,如果更改不成功';无法拟合现有数据,database,django,database-design,Database,Django,Database Design,我有一个这样的模型: class Report(models.Model): updater = models.CharField(max_length=15) pub_date = models.DateTimeField(auto_add_now=True) identifier = models.CharField(max_length=100) ... and so on... class Report(models.Model): update

我有一个这样的模型:

class Report(models.Model):
    updater = models.CharField(max_length=15)
    pub_date = models.DateTimeField(auto_add_now=True)
    identifier = models.CharField(max_length=100)
    ... and so on...
class Report(models.Model):
    updater = models.CharField(max_length=15)
    pub_date = models.DateTimeField(auto_add_now=True)
    ... and so on...

class Log(models.Model):
    report = models.ForeignKey(Report)
    identifier = models.IntegerField()
还有一些领域,但它们与问题无关。现在,该网站的功能非常简单——用户可以查看旧的报告和数据,并可以编辑或添加新的报告

但是,标识符字段实际上是一个整数,表示正在报告的日志文件。大多数情况下,每个报告都有一个日志。但有时它不止一个。我把它作为一个CharField来做,因为我创建这个网站是为了替换一个旧的sharepoint2003网站,在那里,这个字段被视为简单的文本。所以我希望在我的下一个版本中,它应该是这样的,即:

class Report(models.Model):
    updater = models.CharField(max_length=15)
    pub_date = models.DateTimeField(auto_add_now=True)
    identifier = models.CharField(max_length=100)
    ... and so on...
class Report(models.Model):
    updater = models.CharField(max_length=15)
    pub_date = models.DateTimeField(auto_add_now=True)
    ... and so on...

class Log(models.Model):
    report = models.ForeignKey(Report)
    identifier = models.IntegerField()
问题是,因为在旧站点中,该字段是CharField,所以人们可以随意使用它。也就是说,即使他们在同一个报告中更新了不同的日志,他们也只是这样做。有时他们会添加一些与相关的文本

所以我想改变这一点,但我不想丢失所有的旧数据,也不能修复所有的边缘情况(数据库包含大约22000个报告)。我考虑在报告中添加以下内容:

def disp_id(self):
    if self.pub_date < ... #the day I'll do the update
        return self.identifier
    else:
        return ', '.join([log.identifier for log in self.log_set.all()])
def disp_id(self):
如果self.pub_日期<#那天我会做更新
返回自标识符
其他:
返回“,”.join([log.identifier for log in self.log_set.all()]))
但我现在并没有真正摆脱旧领域,是吗?我只是添加了一个新的,并从某个日期起保留原来的空值

据我所知,我想做的是不可能的。我这么问是因为我知道也许我不是第一个处理这类事情的人,也许有一个我不知道的解决方案

希望我的解释足够清楚,提前谢谢

class Report(models.Model):
    updater  = models.CharField(max_length=15)
    pub_date = models.DateTimeField(auto_add_now=True)
    identifier = models.CharField(null=True)
    ... and so on...
    logs     = models.ManyToManyField(Log,null=True)

class Log(models.Model):
    identifier = models.IntegerField()
制作上述模型,然后制作如下脚本:

ident_list = []
for reports in Report.objects.all():
    identifiers = reports.identifiers.split(',')
    for idents in identifiers:
        if not idents in ident_list:
            log = Log.create(**{'identifier' : int(idents)})
            ident_list.append(int(idents))
        else:
            log = Log.objects.get(identifier = int(idents))
        report.log.add(log)
在从表报表中删除列标识符之前,请检查数据。
现在它解决了你的目的吗

不太符合……因此您基本上希望将现有的
Log
模型重命名为
Report
,并创建一个新的
Log
模型,这意味着提议的
Log
模型(无论名称如何)当前不存在?另外,您使用的是什么数据库后端?Mysql。模型本身的名称并不重要,只是一个字段,我想更改为ForeignKeys,直到没有得到它,如果您想进行一些数据迁移,模型/字段的名称很重要。您在
报告中的
disp\u id()
方法显示了
self.identifier
,但是没有为该模型显示
identifier
字段。您是对的,解释令人困惑。我把整件事都重写了,希望这很清楚。我想你不明白我的问题。我不是问要使用哪种类型的关系,我是问如何将CharField转换为ForeignKey,以及如何在不丢失数据的情况下实现这一点的最佳方法我重新编写了这个问题,再看一遍,也许你会更好地理解我的意思我想知道,char字段之前存储的字符串是“,”或者每个标识符都有重复项。没有重复项,只是有时不止一个。而且格式并不总是“,”,这就是整个问题所在。每个用户都做了一些不同的事情,这是一个大混乱,但仍然令人困惑。在新版本中,报告中是否有标识符?请详细说明将字段转换为外键时面临的困难。请添加一些使转换困难的示例数据