Will
Will

Reputation: 1271

Django Model Field Callable Default Not Working

Django's callable model field default are broken. When I set a model field default equal to a callable (see migration file below), all models get the same value even though the callable returns different values each time it is called.

This worked on previous fields, so I'm confused why Django would be failing on this field. Everything works up until the point I migrate, when inspecting the database column reveals all values to be the same.

Migration file:

# -*- 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),
        ),
    ]

Model

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)

The default returns different values:

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

Upvotes: 1

Views: 793

Answers (1)

Will
Will

Reputation: 1271

It looks like this is a limitation of Django: https://docs.djangoproject.com/en/1.11/howto/writing-migrations/#migrations-that-add-unique-fields

Upvotes: 1

Related Questions