gpt4 book ai didi

django - 在 Django 中使用 UUIDField 不断创建新的迁移

转载 作者:行者123 更新时间:2023-12-04 12:42:05 24 4
gpt4 key购买 nike

我有一个简单的模型::

class HasUUID(models.Model):
name = models.CharField(max_length=10)
batchid = models.UUIDField(default=uuid.uuid4(), unique=True)

运行 makemigrations 给了我迁移::

   operations = [
migrations.CreateModel(
name='HasUUID',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
('batchid', models.UUIDField(default=uuid.UUID('79a2d9fe-e1d0-4d4b-884f-fad0bfb14f0f'), unique=True)),
],
),

]

运行 migrate 给我新表没有问题。但我可以再次运行 makemigrations 并得到::

    operations = [
migrations.AlterField(
model_name='hasuuid',
name='batchid',
field=models.UUIDField(default=uuid.UUID('3b96231c-5848-430b-aa90-b6e41b11fd0a'), unique=True),
),

]

虽然我已经忍受了一段时间,但手动删除了不必要的代码,我需要解决它。

所以我认为,在迁移中将默认设置为一个单独的函数,如各种示例所示::

def create_uuid(apps, schema_editor):
m = apps.get_model('web', 'HasUUID')
for inst in m.objects.all():
inst.batchid = uuid.uuid4()
inst.save()

...

migrations.CreateModel(
name='HasUUID',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
('batchid', models.UUIDField(blank=True, null=True)),

],


),
migrations.RunPython(create_uuid),
migrations.AlterField(
model_name='hasuuid2',
name='batchid',
field=models.UUIDField(default=uuid.uuid4, unique=True)
),

同样的问题。所以我尝试在模型中将默认设置为一个单独的函数::

  def create_uuid():
return uuid.uuid4()


class HasUUID2(models.Model):
name = models.CharField(max_length=10)
batchid = models.UUIDField(default=create_uuid(), unique=True)

这让我得到了这个迁移::

  migrations.CreateModel(
name='HasUUID3',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
('batchid', models.UUIDField(default=uuid.UUID('335c3651-b04e-4ed8-a91d-f2da3f53dd8f'), unique=True)),
],
),

再一次,不断产生新的迁移。我也尝试过不使用 unique = True。

我没有想法。因为我之前使用过 UUID 字段,所以在其他地方必须有一些设置或代码,我在 stackoverflow 上找不到类似的问题。有什么建议吗?

最佳答案

您应该将 callable 作为默认值传递,而不是调用的结果,例如:

class HasUUID(models.Model):
name = models.CharField(max_length=10)
batchid = models.UUIDField(default=<b>uuid.uuid4</b>, unique=True)

注意这里有 no 括号来进行调用,因此我们传递了对 uuid4 函数本身的引用。

default=不是特定的 UUID(在您启动服务器时确定),它应该是一个值在创建新对象时确定(无需自己指定 batchid)。

通过传递可调用对象,Django 将理解默认值是调用可调用对象的结果,并将在迁移中对其进行编码。通过调用该函数,您检索调用的result,并且每次运行makemigrations 时,Django 都会认为您改变了对默认值的看法(它首先会认为你想使用 '3b96231c-5848-430b-aa90-b6e41b11fd0a' 作为默认值,然后你想使用 '335c3651-b04e-4ed8-a91d-f2da3f53dd8f' )。通过传递可调用对象,您传递的默认值保持不变。

关于django - 在 Django 中使用 UUIDField 不断创建新的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561597/

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