Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用默认属性向现有Django模型添加非空唯一值_Python_Django_Django Models_Django 1.11 - Fatal编程技术网

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

Python 如何使用默认属性向现有Django模型添加非空唯一值,python,django,django-models,django-1.11,Python,Django,Django Models,Django 1.11,我需要在django模型中添加slug字段,我认为当它不为null时会更好。所以我想把slug添加到模型中 slug = models.SlugField( 'URL', unique=True, default=id_generator, ) 我的id_生成器: import string import random def id_generator(): size=16 chars=string.ascii_lowercase + string.di

我需要在django模型中添加slug字段,我认为当它不为null时会更好。所以我想把slug添加到模型中

slug = models.SlugField(
    'URL',
    unique=True,
    default=id_generator,
)
我的id_生成器:

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_生成器正在调用一次,并对所有模型对象使用相同的值。所以我在独特的领域有两个中心。如何生成唯一值?Django 1.11.5


另外,我知道,我可以设置null=True并自定义模型的保存方法,以便在保存时添加slug。

最重要的是:您没有用于唯一slug的好生成器,例如,可能是使用uuid的最佳方法

import uuid

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

  • 添加了null=True,没有数据迁移的默认值
  • 使用当前字段描述更改模型,并使用“迁移”
  • 示例第一步迁移,替换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_生成器,您的id_生成器中也没有任何东西可以保证唯一性。例如,我使用的id_生成器可能是重复的。问题是为什么这个方法只调用了一次,因为我记得我在默认值中设置了这个方法,并且它为旧django版本中的每个模型实例生成了值。django文档确定它在任何时候都工作过,也许您混淆了什么?