如何在Django中使用自定义自动递增字段实例化对象?

时间:2018-08-23 04:09:21

标签: python django django-models

我正在开发一个应用程序,该应用程序需要从旧数据库中导入一些数据-假设ID介于一到一百万之间。旧数据库中的ID将被加载到一个唯一的整数列中,但不再是主键。在加载旧数据(以及之后的数据)时,应为新系统中创建的条目分配一个三百万开头的序列ID,以便在一定时间内一定有空间导入所有旧条目而不会发生冲突。

目前,这是通过执行ALTER SEQUENCE […] START 3000000的迁移和自定义字段类型实现的:

import typing
from django.db import models, ConnectionHandler
from psycopg2.extensions import AsIs


class SerialField(models.IntegerField):
    def db_type(self, connection: ConnectionHandler) -> str:
        return 'serial'

    def get_db_prep_save(self, value: typing.Optional[int], connection: ConnectionHandler) -> typing.Union[int, AsIs]:
        if isinstance(value, int):
            # so we can override the default with our own value
            return value

        return AsIs('default')

当前解决方案的问题在于,当创建一个具有SerialField的对象时,该字段的值为None,而不是数据库中保存的实际值。我可以更改SerialField以便不必手动同步返回的对象来获取序列值,还是有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

我可能是错的,但我想DBMS会增加序列值,因此在尝试持久保存该对象的值之前,代码中的对象创建实际上不会这样做。缺少2个数据库调用(持久性,获取ID),我想不出一种实现此目标的好方法。