如何使用默认属性向现有Django Model添加非null唯一值

时间:2017-09-28 11:00:04

标签: python django django-models django-1.11

我需要向django模型添加slug字段,而且当它不为null时,它会更好。所以我试图将slug添加到模型

slug = models.SlugField(
    'URL',
    unique=True,
    default=id_generator,
)

我的id_generator:

import string
import random
def id_generator():
    size=16
    chars=string.ascii_lowercase + string.digits
    return ''.join(random.choice(chars) for x in range(size))

问题是我迁移更改时。 方法id_generator正在调用一次,并对所有模型对象使用相同的值。所以我在独特的领域有重复的进步。如何生成唯一值? Django 1.11.5

P.S。我明白,我可以设置null = True并自定义模型的保存方法以在保存时添加slug。

1 个答案:

答案 0 :(得分:1)

最重要的是:你没有好的发电机用于独特的slug,可能是最好的方式使用uuid例如

import uuid

slug = models.CharField(max_length=64, blank=True, unique=True, default=uuid.uuid4)

add-unique-fields

  1. 添加null = True,无默认值使用数据迁移
  2. 使用当前文件描述更改模型,并进行迁移。
  3. 示例第一步迁移,替换YOUMODEL:

    from __future__ import unicode_literals
    import string
    import random
    from django.db import migrations, models
    
    
    def id_generator():
        size=16
        chars=string.ascii_lowercase + string.digits
        return ''.join(random.choice(chars) for x in range(size))
    
    def update_slug(pp, schema_editor):
        for instance in YOUMODEL.objects.all():
            #           ^^^^^^^
            instance.slug = id_generator()
            instance.save()
    
    
    class Migration(migrations.Migration):
    
        operations = [
            migrations.AddField(
                model_name='YOUMODEL',
                #           ^^^^^^^
                name='slug',
                field=models.SlugField(null=True, verbose_name='URL'),
            ),
            migrations.RunPython(code=update_slug)
    
        ]