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