如何将自定义 id 字段转换为普通整数字段?
Posted
技术标签:
【中文标题】如何将自定义 id 字段转换为普通整数字段?【英文标题】:How to convert custom id field to normal integer field? 【发布时间】:2017-10-18 12:14:33 【问题描述】:我正在拼命尝试与 Django 迁移相处,请帮助!
这就是我所拥有的:
class ReceiptNumber(models.Model):
id = models.AutoField(primary_key=True, unique=True)
这是我需要的:
class ReceiptNumber(models.Model):
number = models.IntegerField()
"number" 应该包含之前在 id 中的数据。这样做时,Django 会创建默认 ID 字段。这个需要和以前一样具有相同的 ID,以免破坏与其他表的关系。
你能帮忙吗?我尝试了很多东西来解决这个问题,但我真的不知道该怎么做。我需要一步一步的指南。合乎逻辑的方法是克隆 id 字段,但我不知道如何以及在哪里这样做。
非常感谢您的帮助!已经在这上面浪费了几天了。_。
【问题讨论】:
【参考方案1】:将number
字段添加到ReceiptNumber
模型后,运行makemigrations
。现在更改迁移中的operations
列表以执行以下操作:
# This is your migration
from django.db import migrations, models
def copy_id_to_number(apps, schema_editor):
ReceiptNumber = apps.get_model('receipts_app', 'ReceiptNumber')
for receipt_number in ReceiptNumber.objects.all():
receipt_number.save()
class Migration(migrations.Migration):
dependencies = [
('receipts_app', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='receiptnumber',
name='number',
field=models.IntegerField(default=1),
preserve_default=False,
),
migrations.RunPython(copy_id_to_number),
]
# This should be in your models
class ReceiptNumber(models.Model):
number = models.IntegerField()
def save(self, *args, **kwargs):
"""
Overriden to ensure the `number` field is always the same as the `id`.
"""
# make sure `id` is set
if not self.pk:
super().save(*args, **kwargs)
if not self.number:
self.number = self.pk
return super().save(*args, **kwargs)
【讨论】:
您好,感谢您的输入,但我只需要数字字段为整数。没有唯一性,也没有主键。 Instaed 我需要默认 ID 字段作为 pk 并且只想在数字字段中包含当前数据。 你希望这个号码在数据库中吗?以上是关于如何将自定义 id 字段转换为普通整数字段?的主要内容,如果未能解决你的问题,请参考以下文章
查询数据时,Prisma 将自定义字段附加到 info 参数
将自定义字段添加到 Hibernate Envers 修订表 (revinfo),如 operation_id。哪个是操作实体的PK
Django Allauth - 如何将自定义 CSS 类添加到字段?