简体   繁体   English

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

[英]How to add not null unique value to existing Django Model with default attribute

I need to add slug field to django model, and i thing it's better when it not null. 我需要向django模型添加slug字段,而且当它不为null时,它会更好。 So i'm trying to add slug to model 所以我试图将slug添加到模型中

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

my 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))

The problem is when i migrate changes. 问题是我迁移更改时。 Method id_generator is calling one time and uses the same value for all model objects. 方法id_generator正在调用一次,并对所有模型对象使用相同的值。 So i have dupliicate entrie in unique field. 所以我在独特的领域有重复的进步。 How can i generate unique values? 如何生成唯一值? Django 1.11.5 Django 1.11.5

PS I understand, that i can set null=True and customize model's save method to add slug when saving. PS我明白,我可以设置null = True并自定义模型的保存方法以在保存时添加slug。

MOST IMPORTANT: You have not good generator for unique slug, may be best way use uuid for example 最重要的是:你没有好的发电机用于独特的slug,可能是最好的方式使用uuid例如

import uuid

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

by add-unique-fields 通过add-unique-fields

  1. Added null=True, without default With data migration 添加null = True,无默认值使用数据迁移
  2. Alter model with current filed description, with migrate. 使用当前文件描述更改模型,并进行迁移。

example first step migration, replace YOUMODEL: 示例第一步迁移,替换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)

    ]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM