#23408: Automaticly created migration calls callable for default only once
----------------------------+------------------------------------
     Reporter:  Harper04    |                    Owner:  nobody
         Type:  Bug         |                   Status:  closed
    Component:  Migrations  |                  Version:  1.7
     Severity:  Normal      |               Resolution:  invalid
     Keywords:              |             Triage Stage:  Accepted
    Has patch:  0           |      Needs documentation:  0
  Needs tests:  0           |  Patch needs improvement:  0
Easy pickings:  0           |                    UI/UX:  0
----------------------------+------------------------------------

Comment (by michaeljohnbarr):

 I am sorry - I modified the wrong widow - wasn't supposed to submit the
 main window.

 Callables on properties for ModelFields are used for various reasons. One
 use case is to autocreate uuids.

 My Models:
 {{{
 import uuid

 class AbstractUUIDModel(models.Model):
     [...]
     uuid = models.UUIDField(default=uuid.uuid4, editable=False,
 max_length=32, help_text='Universally unique identifier', unique=True,
 verbose_name='UUID')

     class Meta:
         abstract = True

 class Company(AbstractUUIDModel):
     pass
 }}}

 The generated migration:
 {{{
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals

 from django.db import models, migrations
 import main.models
 import uuid


 class Migration(migrations.Migration):

     dependencies = [
         ('main', '0001_initial'),
     ]

     operations = [
         migrations.AddField(
             model_name='company',
             name='uuid',
             field=models.UUIDField(default=uuid.uuid4, editable=False,
 max_length=32, help_text='Universally unique identifier', unique=True,
 verbose_name='UUID'),
             preserve_default=True,
         ),
     ]
 }}}

 Based on the documentation, you should add the default=uuid.uuid4 on the
 models.UUIDField. However, you cannot do this with the current way
 migrations work. Django currently tries to generate the same UUID for each
 instance that is created. In this instance (Django 1.8 isn't released
 yet), you will run into issues. If default is set to a callable, I believe
 that it is implied that the result should be dynamically generated in
 Python/Django. If the functionality is to stay as stated in the result of
 this ticket, I would have to hand-code this migration for each app that
 previously existed to first create a nullable UUIDField with no default,
 then create a data migration to add distinct UUIDs to the Company, then
 write a migrations.AlterField migration to set null=False. The alternative
 might be to consider creating a special case for the UUIDField to allow
 for non-duplicated UUIDs to be created during migrations.

--
Ticket URL: <https://code.djangoproject.com/ticket/23408#comment:6>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/066.0676acb93b5b1921ea283ad107ee1507%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to