0

我有一个看起来像这样的模型:

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...

还有一些字段,但它们与问题无关。现在该网站的功能非常简单——用户可以查看旧报告及其数据,并可以对其进行编辑或添加新的。

但是,标识符字段实际上是一个整数,表示正在报告的日志文件。大多数时候,每个报告都有一个日志。但有时它不止一个。我将其作为 CharField 进行,因为我构建了该站点以替换旧的 sharepoint 2003 网站,该网站被视为简单文本。所以我希望在我的下一个版本中,它应该是这样的,即像这样:

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,因此人们可以随意使用它。这意味着,即使他们在同一份报告中更新了各种日志,他们也只是这样做了<logid1>, <logid2>。有时他们会添加一些文字<logid1> which is related to <logid2>

所以我想改变这一点,但我不想丢失所有旧数据,也无法修复所有这些边缘情况(数据库包含大约 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()])

但是,我现在并没有真正摆脱旧领域,是吗?我只是添加一个新的并保留某个日期的原始空值。

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

希望我的解释足够清楚,在此先感谢!

4

1 回答 1

0
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)

在从表报告中删除列标识符之前检查数据。它现在解决了你的目的吗?

于 2013-09-19T04:57:43.153 回答