在Django中使用UUIDField继续创建新的迁移

时间:2019-08-19 17:42:08

标签: django uuid

我有一个简单的模型:

Status Code: Forbidden 
Microsoft.Graph.ServiceException: 
 Code: Authorization_RequestDenied 
 Message: Insufficient privileges to complete the operation. 

运行makemigrations可以进行迁移:

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)),
        ],
    ),

]

并且我已经使用了一段时间,手动删除了不必要的代码,但是我需要解决它。

所以我认为,在迁移中将默认值设置为单独的功能,如各种示例所示:

    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)

并不断产生新的迁移。我也尝试过不使用unique = True。

我没主意了。我之前曾经使用过UUID字段,所以其他位置必须有一些设置或代码,并且在stackoverflow上找不到类似的问题。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

默认情况下,您应传递可调用对象,而不是调用结果,例如:

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

请注意,此处没有 个特例可以进行调用,因此我们将引用传递给uuid4函数本身。

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

通过传递可调用对象,Django将理解默认值是对可调用对象的调用结果,它将在迁移中进行编码。通过调用该函数,您可以检索该调用的结果,并且每次您运行makemigrations时,Django都会认为您改变了主意,默认值应该是什么(它将首先显示默认值)。认为您想使用'3b96231c-5848-430b-aa90-b6e41b11fd0a'作为默认设置,后来又想使用'335c3651-b04e-4ed8-a91d-f2da3f53dd8f')。通过传递一个Callable,您传递的默认值将保持不变。

答案 1 :(得分:0)

即使你传递了一个可调用的,也会生成一个迁移。