Django 模型字段可调用默认值不起作用

Posted

技术标签:

【中文标题】Django 模型字段可调用默认值不起作用【英文标题】:Django Model Field Callable Default Not Working 【发布时间】:2018-10-20 22:02:06 【问题描述】:

Django 的可调用模型字段默认值已损坏。当我将模型字段默认设置为可调用对象(请参阅下面的迁移文件)时,所有模型都会获得相同的值,即使可调用对象每次调用时返回不同的值。

这适用于以前的领域,所以我很困惑为什么 Django 在这个领域会失败。在我迁移之前一切正常,当检查数据库列时,所有值都相同。

迁移文件:

# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2018-05-10 14:53
from __future__ import unicode_literals

from django.db import migrations, models
import screen.models


class Migration(migrations.Migration):

    dependencies = [
        ('screen', '0064_employer_enable_show_question_template_tags'),
    ]

    operations = [
        migrations.AddField(
            model_name='question',
            name='key',
            field=models.TextField(default=screen.models.generate_question_key),
        ),
    ]

型号

def generate_question_key():
    # return a random string 64 characters long
    return generate_random_hash(64)

class Question(Model):
    name = TextField()
    points = PositiveIntegerField() # how much it's worth
    time_spent = PositiveIntegerField(default = 0) # seconds
    score = PositiveIntegerField(default = 0)
    key = TextField(default = generate_question_key)

默认返回不同的值:

>>> import screen
>>> screen.models.generate_question_key()
'JpZzloZkiLyvPLrDZ9764VTWkNUon1FD08mGKODa2uiqW1nV422HXVvt78MsW7aR'
>>> screen.models.generate_question_key()
'NHyTwPDA2cAAsTeIR77INLMM6Ik14EQ6vTlrTv4ZwV56nt6jGEtR8bKn8iyWDeMA'
>>> screen.models.generate_question_key()
'q2aALA7WmvtiKLiGXfNEStpKhOFcNpMDrJ8Y9sv6mwWNsUU6mdgMlgaW5yJJ1yEI'
>>> 

【问题讨论】:

它只是返回一个随机字符串:def choices(items, k): result = [] for _ in range(k): result.append(items[random.randint(0, len(items) - 1)]) return resultdef generate_random_hash(length = 16): letters = \ '0123456789' + \ 'qwertyuiopasdfghjklzxcvbnm' + \ 'QWERTYUIOPASDFGHJKLZXCVBNM' return ''.join(choices(letters, k = length)) 请参阅writing migrations that add unique fields 上的文档。如那里所述,您需要添加单独的数据迁移来设置唯一值。 【参考方案1】:

看起来这是 Django 的一个限制:https://docs.djangoproject.com/en/1.11/howto/writing-migrations/#migrations-that-add-unique-fields

【讨论】:

以上是关于Django 模型字段可调用默认值不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-select 设置默认值不起作用

在 django slug 字段中使用外语不起作用

为啥django模型层的null和blank约束不起作用

Django dict键,for循环中的值不起作用

PDFBox 设置字段值不起作用

模型表单上的 Django 自定义设置大小属性不起作用