python - 如何使用默认属性向现有 Django 模型添加非空唯一值

标签 python django django-models django-1.11

我需要将 slug 字段添加到 django 模型中,我认为当它不为 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 调用一次并对所有模型对象使用相同的值。所以我在独特的领域有重复的条目。我怎样才能产生独特的值(value)? Django 1.11.5

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

最佳答案

最重要的是:你没有好的 unique slug 生成器,可能最好的方法是使用 uuid,例如

import uuid

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

来自add-unique-fields

  1. 添加了 null=True,不带默认数据迁移
  2. 用当前提交的描述改变模型,并进行迁移。

示例第一步迁移,替换 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)

    ]

关于python - 如何使用默认属性向现有 Django 模型添加非空唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46467509/

相关文章:

python - 如何查询定义具有两个 int 字段(IP、掩码)的 IP 范围的 Django 模型

Django表单: default value if user leaves field blank

django - 如何修复 Aptana pydev django mongo-engine 中的 "Undefined variable from import: objects"?

python - 加权直方图的样本

python - 如何使用 Sphinx 链接到 str 方法?

python - 有没有办法检查字符串是否是 django 查询集的有效过滤器?

django - 如何比较数据库中的两个日期,以便下一个日期从前一个日期开始?

django - 使用 Django 1.5 实现多种用户类型

python - 在 Windows 上为 Python 安装 Pillow

python - 是否有 subprocess.call 的安静版本?