[PYTHON] À propos de la déconstruction et de la déconstructibilité de Django

Aperçu

--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.

Erreur rencontrée

--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 **

Validateur personnalisé

# 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},
        )

Champ personnalisé

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

Résumé

référence

Recommended Posts

À propos de la déconstruction et de la déconstructibilité de Django
À propos de _ et __
À propos du ProxyModel de Django
À propos du comportement Model.save () de Django et de l'erreur de blocage MySQL
À propos de la classe et de l'instance
À propos de cumprod et cummax
À propos de la validation croisée et de la valeur F
Ceci et cela à propos de pd.DataFrame
À propos des objets et des classes Python
À propos des variables et des objets Python
À propos du groupe Raid et du LUN
À propos de la fonction fork () et de la fonction execve ()
À propos de Python, len () et randint ()
À propos de la date et du fuseau horaire Python
À propos du ratio de Sharpe et du ratio de Sortino
À propos de Python et des expressions régulières
À propos des opérations Python et OS
À propos de http.Handle () et http.NewServeMux (). Handle ()
Python # À propos de la référence et de la copie
À propos du tableau Numpy et d'un tableau
À propos de Python sort () et reverse ()
MVT-Relation entre le modèle et le module de Django
À propos de l'installation des séries Pwntools et Python2
Résumé et erreurs courantes sur cron
À propos de Python dict et des fonctions triées
À propos de Python et Cython dtype
À propos des thèmes MkDocs et de leurs coutumes
À propos de Python Pickle (cPickle) et Marshal
[Python] À propos des classes Executor et Future
À propos de Python, à partir et à l'importation, comme
À propos des données de séries chronologiques et du surentraînement