2016-08-12 3 views
3

В MS SQL Server существует функция создания вычисленного столбца: столбец таблицы, который вычисляется «на лету» во время поиска. Это более или менее отображение на использование метода в модели Django для получения вычисленного значения (общий пример - получение полного имени на основе сохраненных полей Forename/Surname).Постоянные расчетные поля в Django

Для дорогостоящих операций SQL Server предоставляет опцию Persisted. Это заполняет столбец таблицы результатами расчета и обновляет эти результаты при обновлении таблицы - очень полезная функция, когда вычисление выполняется не быстро, но не часто изменяется по сравнению с доступом.

Однако в Django я не могу найти способ дублирования этой функции. Мне что-то не хватает? Мое лучшее предположение - это какое-то настраиваемое поле, которое принимает функцию как параметр, но я не мог видеть ранее существовавший из них. Есть ли способ лучше?

ответ

3

Один подход заключается просто использовать регулярные поля модели, которая вычисляется всякий раз, когда объект сохраняется, например ,:

class MyModel(models.Model): 
    first_name = models.CharField(max_length=255) 
    surname = models.CharField(max_length=255) 

    # This is your 'persisted' field 
    full_name = models.CharField(max_length=255, blank=True) 

    def save(self, *args, **kwargs): 
     # set the full name whenever the object is saved 
     self.full_name = '{} {}'.format(self.first_name, self.surname) 
     super(MyModel, self).save(*args, **kwargs) 

Вы можете сделать это специальное поле read-only в админке и аналогично exclude it от любых модельных форм ,

+0

Я, по-видимому, идиот. Это отличный способ решения проблемы. Я немного поправлю его, и поймаю в сигналы сохранения, так как мне нужно, чтобы поле было пересчитано на вставки и удаляет (в зависимости от количества записей). Но да, этот подход по сути правильный. – James