2013-11-15 115 views
2

當我檢查Trac的數據庫中,我得到:Django的自定義主鍵

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,但在ticket_change原來的主鍵Trac是:

Primary key (ticket, time, field) 

但是在Django中不可能:Django Multi-Column Primary Key Discussion

如果我像pk一樣定義time我不能在同一時間添加兩張票據更改。

我該怎麼辦?

回答

1

你說得對。這是一個已知的問題。所以唯一的解決方案是黑客(有點)。

您最好的選擇是使用django-compositepks。缺點是它不能真正支持模型關係,所以你將無法從你的composite-pk模型導航到任何關係。然而,看着你的TicketChange模型,這似乎不是一個問題(除非你有更多的模型與這個模型有關係)。

另一種選擇是手動添加id列(並確保對db應用任何其他更改),從而創建新的一列主鍵。第三個選項(以及我可能會做的)與最後一個選項非常相似,但更簡潔,將從頭創建一個新數據庫,然後通過從現有遺留數據庫中提取數據來使用腳本填充它。

對不起,我沒有任何更好的解決方案,就是這樣。傳統的dbs和django總是令人頭痛,自己也經歷了一些類似的過程。希望這可以幫助!

0

這是Django ORM根本不支持的用例。如果你能修改數據庫模式,添加一個額外的列作爲Django的主鍵:一個帶有AUTO_INCREMENT(MySQL)或SERIAL(PostgreSQL)的整數字段。它不應該使用該表破壞其他應用程序,因爲插入新記錄時它將由數據庫管理。在通過ORM查詢時仍然可以使用實際主鍵:

ticket_change = TicketChange.objects.get(ticket=1234, time=5678, field='myfield')