Django ORM: реализовать предварительное сохранение для «поля» вместо «модели» - PullRequest
1 голос
/ 13 марта 2019

скажем, у меня есть эта модель:

class MyModel(models.Model):
    char_field = models.CharField(max_length=64)
    json_field = LimitedJSONField(default={})

где LimitedJSONField - это настраиваемое поле для хранения JSONStrings в БД.

Я хотел бы выполнить проверку перед сохранением на json_field (например, обрезать его длину, если она больше). Я читал о переопределении метода save для MyModel, я также знаю, что могу реализовать сигнал pre-save, но я бы хотел обработать его на уровне поля. Скажем, я использую LimitedJSONField на 500 моделях. Нужно ли переопределять метод save для каждой из этих 500 моделей? Я реализовал метод validate в LimitedJSONField, но он не запускается при сохранении (он запускается только при проверке формы, т.е. full_clean подпрограмма).

Как я могу реализовать валидатор для LimitedJSONField, чтобы, если бы Model его использовал, это поле было проверено в отношении одной единственной бизнес-логики, написанной внутри LimitedJSONField?

Проще говоря, я хотел бы реализовать логику в классе field, и я бы хотел, чтобы в классе Model не было написано никакой логики, чтобы решение было масштабируемым, чтобы новые классы Model могли использовать это поле без необходимости реализовывать кипящую среду. логический код.

Большое спасибо за ваше время!

1 Ответ

1 голос
/ 14 марта 2019

Не могли бы вы создать родительский класс с одним методом сохранения и использовать его в качестве миксина, который наследуется всеми вашими другими моделями?

Что-то вроде:

class SpecialJsonModel(models.model):
    json_field = LimitedJSONField(default={})

    def save(self, *args, **kwargs):
        // Specific save logic goes here

class OtherModelA(SpecialJsonModel)
    char_field = models.CharField(max_length=64)

class OtherModelB(SpecialJsonModel)
    char_field = models.CharField(max_length=64)

Тогда вам нужно будет написать только один переопределенный метод сохранения.

...