Django South外键指的是自定义字段的pks

时间:2010-03-22 00:25:17

标签: django django-south

我正在使用一个使用MySQL big int的遗留数据库,所以我设置了一个简单的自定义模型字段来处理这个问题:

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 south用于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和South 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 个答案:

答案 0 :(得分:1)

为什么在显然是FK的问题时你想要复制AutoField? Subclass ForeignKey并返回正确的类型。