2010-03-22 61 views
1

我與使用MySQL的大INT所以我設置一個簡單的自定義模型字段來處理這種遺留數據庫工作:Django的南外鍵指PKS與自定義字段

class BigAutoField(models.AutoField): 
    def get_internal_type(self): 
     return "BigAutoField" 

    def db_type(self): 
     return 'bigint AUTO_INCREMENT' # Note this won't work with Oracle. 

這工作正常django南爲id/pk字段(mysql desc「| id | bigint(20)| NO | PRI | NULL | auto_increment |」)但其他模型中的ForeignKey字段的引用字段創建爲int(11)而不是bigint (20)。

我假設我必須添加一個內省規則到BigAutoField,但似乎並沒有在文檔中提到這種規則(http://south.aeracode.org/docs/customfields.html)。

更新:目前使用Django 1.1.1和0.6.2南

更新2: 似乎Django的代碼負責。

從django.db.models.fields.related.ForeignKey.db_type():

rel_field = self.rel.get_related_field() 
if (isinstance(rel_field, AutoField) or 
     (not connection.features.related_fields_match_type and 
     isinstance(rel_field, (PositiveIntegerField, 
           PositiveSmallIntegerField)))): 
    return IntegerField().db_type() 

由於我重載下拉列表AutoField isinstance被返回true,它被默認爲IntegerField。猜猜我必須複製AutoField代碼並以此方式執行此操作。 。 。

回答

1

爲什麼要複製AutoField當它明確FK的問題?子類ForeignKey並返回正確的類型。

+0

是的,我更換了所有的AutoField代碼後發現了這個。 ForeignKey然後將自己設置爲bigint AUTO_INCREMENT,這會使事情變得糟糕。 Django 1.2提供了bigint,因此我將在我的南遷移中使用手動遷移sql查詢解決該問題,直到我們升級到1.2和0.7。 – 2010-03-25 00:20:02