[PYTHON] Über Djangos Dekonstruktion und Dekonstruierbarkeit

Überblick

--Django verfügt seit 1.7 über eine integrierte Migrationsfunktion. -Um Unterschiede mit ** Makemigrationen ** automatisch zu extrahieren, müssen benutzerdefinierte Felder und benutzerdefinierte Validatoren des Modells bearbeitet werden. --Field erfordert die Implementierung der ** Dekonstruktionsmethode ** --Validator erfordert ** dekonstruierbaren ** Dekorator und ** \ _ \ _ eq \ _ \ _ ** Methodenimplementierung ――Einfache Zusammenfassung der Korrespondenzinhalte.

Fehler aufgetreten

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

Benutzerdefinierter Validator

# 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
    )
from django.core.exceptions import ValidationError
from django.utils.deconstruct import deconstructible

@deconstructible # <-Dekorateur hinzufügen
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__Methode implementieren
        return (
            isinstance(other, self.__class__) and (self.size == other.size)
        )
1. UploadSizeValidator(size=100)Angenommen, Sie haben eine Migrationsdatei mit erstellt
2.Ändern Sie die Größe auf 200 und führen Sie Makemigrationen durch
3. __eq__Vor dem Methodenwechsel(other.size=100)Und nach der Änderung(self.size=200)Größe vergleichen
4.Die AlterField-Migrationsdatei wird generiert, da sie nicht übereinstimmt

――Der Inhalt der tatsächlich generierten Migration sieht folgendermaßen aus

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

Benutzerdefinierte Feld

--Wenn Sie ein benutzerdefiniertes Feld erstellen, müssen Sie die Methode ** deconstruct ** implementieren.

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

Zusammenfassung

Referenz

Recommended Posts

Über Djangos Dekonstruktion und Dekonstruierbarkeit
Über _ und __
Über Djangos ProxyModel
Informationen zum Model.save () -Verhalten von Django und zum MySQL-Deadlock-Fehler
Über Klasse und Instanz
Über Cumprod und Cummax
Über Kreuzvalidierung und F-Wert
Dies und das über pd.DataFrame
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
Über Raid Group und LUN
Informationen zur Funktion fork () und zur Funktion execve ()
Über Python, len () und randint ()
Informationen zu Python-Datums- und Zeitzone
Über Sharpe Ratio und Sortino Ratio
Über Python und reguläre Ausdrücke
Informationen zu Python- und Betriebssystemoperationen
Informationen zu http.Handle () und http.NewServeMux (). Handle ()
Python # Über Referenz und Kopie
Über Numpy Array und Asarray
Über Python sort () und reverse ()
Djangos MVT-Beziehung zwischen Modell und Modul
Informationen zur Installation der Serien Pwntools und Python2
Zusammenfassung und häufige Fehler zu Cron
Über Python-Diktat und sortierte Funktionen
Über Python und Cython dtype
Über MkDocs-Themen und ihre Bräuche
Über Python Pickle (cPickle) und Marschall
[Python] Über Executor und zukünftige Klassen
Über Python, aus und importieren, als
Über Zeitreihendaten und Übertraining