我有一个简单的模型:
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上找不到类似的问题。有什么建议吗?
答案 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)
即使你传递了一个可调用的,也会生成一个迁移。