【问题标题】:How to convert custom id field to normal integer field?如何将自定义 id 字段转换为普通整数字段?
【发布时间】: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 字段,但我不知道如何以及在哪里这样做。

非常感谢您的帮助!已经在这上面浪费了几天了。_。

【问题讨论】:

    标签: django django-models django-migrations django-database django-1.11


    【解决方案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 并且只想在数字字段中包含当前数据。
    • 你希望这个号码在数据库中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多