Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中使用自定义自动递增字段实例化对象?_Python_Django_Django Models - Fatal编程技术网

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

Python 如何在Django中使用自定义自动递增字段实例化对象?,python,django,django-models,Python,Django,Django Models,我正在开发一个应用程序,它需要从一个旧数据库导入一些数据,比如说IDs 1到100万。旧数据库中的ID将加载到唯一的整数列中,但不再是主键。在加载旧数据(以及之后)时,应为新系统中创建的条目分配一个从300万开始的序列ID,以便在一段时间内肯定有空间导入所有旧条目,而不会发生冲突 这目前是通过迁移doingALTER SEQUENCE[…]START 3000000和自定义字段类型实现的: import typing from django.db import models, Connectio

我正在开发一个应用程序,它需要从一个旧数据库导入一些数据,比如说IDs 1到100万。旧数据库中的ID将加载到唯一的整数列中,但不再是主键。在加载旧数据(以及之后)时,应为新系统中创建的条目分配一个从300万开始的序列ID,以便在一段时间内肯定有空间导入所有旧条目,而不会发生冲突

这目前是通过迁移doing
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
,这样我就不必手动同步返回的对象来获取序列值,或者是否有其他方法来实现这一点?

我可能错了,但我认为序列值是由DBMS递增的,所以,在代码中创建对象实际上不会做到这一点,除非您尝试持久化所述对象,在这种情况下,它的值是获得的。缺少2个DB调用(persist,fetch ID),我想不出一个好方法来实现这一点