--Django a une fonction de migration intégrée depuis la 1.7. -Pour extraire automatiquement les différences avec ** makemigrations **, il est nécessaire de travailler sur des champs personnalisés et des validateurs personnalisés de Model. --Le champ nécessite la mise en œuvre de la méthode ** deconstruct ** --Validator nécessite ** déconstructible ** décorateur et ** \ _ \ _ eq \ _ \ _ ** implémentation de méthode ――Facile à résumer le contenu de la correspondance.
--Lorsque j'ai créé un validateur personnalisé et exécuté ** makemigrations **, j'ai rencontré l'erreur suivante:
python
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/1.9/topics/migrations/#migration-serializing
--Quand j'ai essayé de résoudre ça, je suis arrivé à l'histoire de ** déconstruire **
# validators.py ----
from django.core.exceptions import ValidationError
class UploadSizeValidator:
def __init__(self, size=None):
if size:
self.size = size
def __call__(self, value):
if value.file.size > self.size:
raise ValidationError('Upload Size Error')
# models.py ----
class Question(models.Model):
question_image = models.ImageField(
upload_to='question_image',
validators=[UploadSizeValidator(size=200)],
default=None
)
--Cependant, à partir de 1.7, l'erreur ci-dessus est affichée à moins que Validator ne soit implémenté comme suit.
from django.core.exceptions import ValidationError
from django.utils.deconstruct import deconstructible
@deconstructible # <-Ajouter un décorateur
class UploadSizeValidator:
def __init__(self, size=None):
if size:
self.size = size
def __call__(self, value):
if value.file.size > self.size:
raise ValidationError('Upload Size Error')
def __eq__(self, other): # <- __eq__Mettre en œuvre la méthode
return (
isinstance(other, self.__class__) and (self.size == other.size)
)
1. UploadSizeValidator(size=100)Supposons que vous ayez créé un fichier de migration avec
2.Changez la taille en 200 et exécutez makemigrations
3. __eq__Avant le changement de méthode(other.size=100)Et après le changement(self.size=200)Comparer la taille
4.Le fichier de migration AlterField est généré car il ne correspond pas
――Le contenu de la migration réellement générée ressemble à ceci
operations = [
migrations.AlterField(
model_name='question',
name='question_image',
field=models.ImageField(
default=None, upload_to='question_image',
validators=[polls.validators.UploadSizeValidator(size=200)]
),
),
def validate_even(value):
if value % 2 != 0:
raise ValidationError(
_('%(value)s is not an even number'),
params={'value': value},
)
class HandField(models.Field):
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 104
super(HandField, self).__init__(*args, **kwargs)
def deconstruct(self): # <- deconstruct
name, path, args, kwargs = super(HandField, self).deconstruct()
del kwargs["max_length"]
return name, path, args, kwargs
# refs https://docs.djangoproject.com/ja/1.9/howto/custom-model-fields/#field-deconstruction
Recommended Posts