Skip to main content
 首页 » 编程设计

python之Django 自定义主键

2025年05月04日37www_RR

当我检查 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一直很头疼,自己也经历过一些类似的流程。希望这对您有所帮助!