gpt4 book ai didi

django - 如何在 Django 中支持 AutoField(primary_key=False)?

转载 作者:行者123 更新时间:2023-12-01 12:28:00 25 4
gpt4 key购买 nike

我需要添加一个不是主键的 autoinc 字段。我正在将使用自动递增字段的非常大的生产数据库迁移到 models.UUIDField .我一直在进行分段迁移,现在我的所有关系都与这两种字段类型重复。我已准备好进行主键交换,但不幸的是,我仍然需要为旧客户端保留自动递增的整数字段,因为它已被弃用。

由于 django 不允许我使用 primary_key=False 定义自动字段(尽管这在 db 层完全支持),我正在寻找一个简单的解决方案。我最初的策略是简单地将字段更改为 models.BigIntegerField('GUID', db_index=True, null=True, unique=True)然后手动设置默认nextval('my_guid_seq'::regclass)使用 migrations.RunSQL .到目前为止一切顺利,除了没有。原来,因为我的null=True声明,ORM 层的 django 正在接管并插入 null这将不允许数据库层的默认值来完成它的工作。

由于糟糕的设计,核心开发人员很快就拒绝了这个请求,我绝对同意这一点,但是有非常有效的用例,例如这样。 https://code.djangoproject.com/ticket/8576

我是一个非常弱的 Django 开发人员,所以我不想在 ORM 层参与杂草元编程。根据定义,这是一个 hack,所以我正在寻找最简单、最有创意的解决方案来解决这个限制

最佳答案

您可以子类化 AutoField并覆盖 _check_primary_key方法。

from django.db.models.fields import AutoField
from django.db.models.fields import checks


class AutoFieldNonPrimary(AutoField):

def _check_primary_key(self):
if self.primary_key:
return [
checks.Error(
"AutoFieldNonPrimary must not set primary_key=True.",
obj=self,
id="fields.E100",
)
]
else:
return []

AutoField源代码 here

编辑:更新链接

关于django - 如何在 Django 中支持 AutoField(primary_key=False)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com