Как установить конкретное значение для атрибута модели каждый раз, когда я сохраняю его в Django? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть устаревший проект, который сохраняет модели с save, bulk_create и другими методами в рамках.

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

Я задаю этот вопрос, потому что я не уверен, что все способы сохранения возможны в Django, кроме save и bulk_create и знаниячто в bulk_create:

Метод save () модели вызываться не будет, а сигналы pre_save и post_save отправляться не будут.

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#bulk-create

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Вы можете установить значение по умолчанию в поле вашей модели, используя пользовательские функции.Например, у вас есть модель Post, которая также имеет поле slug.Требуется, чтобы значение по умолчанию для поля slug создавалось автоматически из поля name.Вы можете написать свою модель, как показано ниже:

class Post(models.Model):

    def generate_slug(self):
        return slugify(self.name)

    name = models.CharField()
    description = models.TextField()
    attachment = models.FileField()
    slug = models.CharField(default=generate_slug)

Таким образом, при создании нового сообщения поле слаг будет автоматически генерироваться из поля name.

0 голосов
/ 16 мая 2018

Лучший способ решить эту проблему - переопределить метод save (). Вы также можете использовать необработанные SQL-запросы, которые также могут легко решить ваши проблемы

class Model(model.Model):
    field1=models.CharField()
    field2=models.CharField()
    field3=models.CharField()

    def myfunc (self):
    pass 

        #
    def save(self, *args, **kwargs):
        q =  MyModel.objects.select_related('fields1', 'field2',  'filed2').filter(related_field)
    super(Model, self).save(*args, **kwargs)
0 голосов
/ 12 мая 2018

Насколько я знаю, есть 3 способа создания / обновления экземпляров модели (которые являются записями в таблицах базы данных):

  1. Использование метода экземпляра модели save().
  2. Использование методов набора запросов create(), update(), get_or_create(), update_or_create() и bulk_create().
  3. Использование необработанного SQL или других низкоуровневых способов.

Если вы намереваетесь вычислить значение поля при сохранении, вы можете переопределить все методы, перечисленные выше.

Сигналы (например, pre_create) не являются полным решением, поскольку они не запускаются при использовании bulk_create(), и поэтому некоторые экземпляры могут быть сохранены без вычисляемого атрибута.

Нет способа django (который я знаю) перехватить третью точку, которую я упомянул (необработанный SQL).


Вы не уточнили свой вариант использования, но (в зависимости от размера таблицы и частоты изменений), возможно, вы также можете попробовать:

  1. запустить периодический процесс (возможно, с использованием crontab), который обновляет вычисляемое поле всех экземпляров модели.
  2. добавить триггер базы данных, который вычисляет поле.

Устаревшие базы данных или системы, или, как правило, работать с ними неинтересно, поэтому, возможно, вам придется согласиться на неоптимальное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...