2

我正在拼命地尝试与 Django 迁移相处,请帮忙!

这就是我所拥有的:

class ReceiptNumber(models.Model):
    id = models.AutoField(primary_key=True, unique=True)

这就是我需要的:

class ReceiptNumber(models.Model):
    number = models.IntegerField()

“数字”应该具有之前在 id 中的数据。这样做时,Django 会创建默认 ID 字段。这需要与以前具有相同的 ID,以免破坏与其他表的关系。

你能帮忙吗?我尝试了很多东西来解决这个问题,但我真的不知道该怎么做。我需要一步一步的指南。合乎逻辑的方法是克隆 id 字段,但我不知道如何以及在哪里这样做。

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

4

1 回答 1

0

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)
于 2017-05-18T15:36:50.667 回答