在Django中使用Postgres的“serial”(主键除外)

时间:2015-07-03 07:04:25

标签: python django postgresql

我已为我的模型BigSerialField创建了一个自定义字段,如下所示。

class BigSerialField(models.Field):

description = 'Big Serial of Postgres'

def __init__(self, *args, **kwargs):
    super(BigSerialField, self).__init__(*args, **kwargs)

def deconstruct(self):
    name, path, args, kwargs = super(BigSerialField, self).deconstruct()
    return name, path, args, kwargs

def db_type(self, connection):
    return 'bigserial'

def from_db_value(self, value, expression, connection, context):
    if value is None:
        raise Exception('Big Serial cannot be null!')
    return int(value)

def get_prep_value(self, value):
    return None

def get_db_prep_value(self, value, connection, prepared=False):
    return None

def get_db_prep_save(self, value, connection):
    return self.get_db_prep_value(value, connection)


def to_python(self, value):
    if isinstance(value, int):
        return value

    if value is None:
        raise Exception('Big Serial cannot be null!')

    return int(value)

这会引发错误,因为现在ORM会在保存时尝试将null传递给字段。 Postgres需要使用DEFAULT关键字。但是,当我尝试在'default'中发送None而不是get_db_prep_save时,Postgres会引发错误,因为它会正确地将'default'解释为字符串。

那么,Django将DEFAULT关键字发送给Postgres的方式是什么?

0 个答案:

没有答案