【问题标题】:How to add not null unique value to existing Django Model with default attribute如何使用默认属性向现有 Django 模型添加非空唯一值
【发布时间】:2018-03-10 02:25:04
【问题描述】:

我需要将 slug 字段添加到 django 模型,我认为它不为空时会更好。所以我正在尝试将 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

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

【问题讨论】:

标签: python django django-models django-1.11


【解决方案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. 使用当前文件描述更改模型,并进行迁移。

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

    ]

【讨论】:

  • 我只是用了我的 id_generator。问题是为什么这个方法只调用一次,因为我记得我将方法设置为默认值,它为旧 django 版本中的每个模型实例生成值
  • 不要确定它在任何时候都可以工作,由 django docs add-unique-fields 提供,也许你在混淆某些东西?
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2018-10-21
  • 2013-02-21
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多