当我检查 Trac 数据库时,我得到:
class TicketChange(models.Model):
ticket = models.IntegerField()
time = models.BigIntegerField()
author = models.TextField(blank=True)
field = models.TextField()
oldvalue = models.TextField(blank=True)
newvalue = models.TextField(blank=True)
class Meta:
managed = False
db_table = 'ticket_change'
非主键:
>>> TicketChange.objects.all()
DatabaseError: column ticket_change.id does not exist
LINE 1: SELECT "ticket_change"."id", "ticket_change"."ticket", "tick...
因为我需要指定一个pk但是Trac中ticket_change的原始主键是:
Primary key (ticket, time, field)
但这在 Django 中是不可能的:Django Multi-Column Primary Key Discussion .
如果我像 pk 一样定义 time,我就不能同时添加两个票证更改。
我能做什么?
请您参考如下方法:
你是对的。这是一个已知问题。所以唯一的解决方案是黑客(某种程度上)。
最好的选择是使用 django-compositepks .缺点是它并不真正支持模型关系,因此您将无法从复合 pk 模型导航到任何关系。但是,查看您的 TicketChange 模型,这似乎不是问题(除非您有更多模型与此模型有关系)。
另一种选择是手动添加 id 列(并确保将任何其他更改应用到数据库),从而创建新的单列主键。第三种选择(也是我可能会做的)与最后一种非常相似但更清晰,是从头开始创建一个新数据库,然后通过从现有遗留数据库中获取数据来用脚本填充它。
抱歉,我没有更好的解决方案,就是这样。 Legacy dbs和django一直很头疼,自己也经历过一些类似的流程。希望这对您有所帮助!
