I have an issue with migrations.

Suppose I declare (in my application, with name myapp) a field with a 
validators= declared. In such value (which is an iterable), I declare a 
function:

class MyModel(models.Model):
    """
    This one is identifiable.
    """

    identifier = models.CharField(max_length=10, unique=True, validators=[
valid_identifier])

Assume I created the migration with makemigrations:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.conf import settings
import django.core.validators
import micnt.models


class Migration(migrations.Migration):

    dependencies = [
        ...
    ]

    operations = [
        migrations.CreateModel(
            name='MyModel',
            fields=[
                ('identifier', models.CharField(max_length=10, unique=True, 
validators=[myapp.models.valid_identifier])),
            ],
            options={
            },
            bases=(models.Model,),
        ),
    ]

Assume valid_identifier is any external callable which will take one 
positional argument, and eventually raise ValidationError under certain 
conditions.

Now the requirements vary: The identifier may be national or foreign, so 
the country is required as an additional field, and also a discriminator 
field. Additionally, the validation I must perform is cross-field, so 
instead of using something in validators, I define a clean() method, and 
make the combination of country/identifier unique, instead of just the 
identifier unique:

class MyModel(models.Model):
    """
    This one is identifiable.
    """

    identifier_type = models.CharField(max_length=10, choices=(('passport', 
_(u'Passport')), ('national', _(u'National'))), null=False)
    identifier = models.CharField(max_length=10)
    country = models.ForeignKey(Country, null=False)  # assume Country 
model exists

    class Meta:
        unique_together = (('identifier', 'country'),)

    def clean(self):
        raise ValidationError('Implement this!')
    

And then, I don't need anymore the valid_identifier function, since my code 
does not use it anymore. So I delete it.

Now I will create the migration with makemigrations as usual. What will 
happen?

a. The command will succeed.
b. The command will explode (i. e. a normal Python exception).
c. The command will create an inconsistent migration, without exploding.
d. Jesus will come again.
e. The command will get into a kind of endless loop.

If you guesses "b", you were right. Django will report an error, since 
myapp.models.valid_identifier does not exist anymore (AttributeError).

So, once I set a value for validators= parameter and create a migration, I 
am forced to keep such reference valid for the rest of my life (e.g. by 
having valid_identifier=None, if I don't need the function anymore), or 
else the migrations will not work again since they will be traversed, 
imported, and will get such AttributeError.

Is this an expected, normal, behavior?

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/0f186fe2-e37a-41ef-882f-9d509dd6c5cb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to