2015-01-20 5 views
-1

У меня есть модель Django, у которой есть следующие поля.Динамическое поле в модели Django

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

Я доволен текущей реализацией, но я как-то обеспокоен последствиями в долгосрочной перспективе. Это плохой дизайн? В этом случае есть альтернативы, которые позволяют сделать это более чисто? Чище ли делать вычисления в тегах шаблонов?

Возможно, эта логика может быть поставлена ​​менеджером? Прокси-модель? Я думал, что это свойство как свойства, но вычисления зависят от объекта запроса, поэтому его нужно как-то сделать в представлении.

Большое спасибо.

class Printer(TimeStampedModel): 
    user = models.ForeignKey(
     User) 

    minimal_cost = models.IntegerField() 

    active = models.BooleanField(default=True) 



def some_view(request): 
     for printer in printer_list: 
      printer.distance = printer.distance_point(user_point) 
      printer.materials_costs = MaterialsCosts(printer, cart=cart) 
      printer.minimum_price = printer.materials_costs.minimum_printer_price() 
+0

Что ограничивает вас делать эти расчеты на уровне базы данных, используя агрегацию Джанго или что-то подобное? –

+0

Это нетривиальные вычисления. Например, расчет расстояния не поддерживается из коробки Django (только GeoDjango). Вы подразумеваете, что эти динамические поля - плохой стиль? – cyberjoac

+1

Вопросы по оптимизации существующего кода (особенно код, который работает без ошибок) лучше всего подходят для codereview.stackexchange.com –

ответ

1

Вы можете переместить свой метод расчета в models.py, вам не следует выполнять такие вычисления непосредственно внутри представления.

class Printer(TimeStampedModel): 
    user = models.ForeignKey(
     User) 

    minimal_cost = models.IntegerField() 

    active = models.BooleanField(default=True) 

    @classmethod 
    def set_my_attrs(cls): 
     printer_list = cls.objects.all() #Im assuming that you need all the printers for your calculations 
     for printer in printer_list: 
      printer.distance = printer.distance_point(user_point) 
      printer.materials_costs = MaterialsCosts(printer, cart=cart) 
      printer.minimum_price = printer.materials_costs.minimum_printer_price() 
      printer.save() # dont forget saving :) 

Затем в views.py

def some_view(request): 

     Printer.set_my_attrs() 
+0

Спасибо за ваш ответ. Расчеты, которые я делаю, не означают, что они являются постоянными. Они действительны только для одного расчета и все, я не хочу их сохранять в БД. Все еще лучше установить их в модели? – cyberjoac

+0

@cyberjoac в этом случае вы должны создать что-то вроде services.py и переместить свои вычисления там. У меня всегда есть 3 слоя, views.py для обработки запросов и ответов. services.py реализуют сложные вычисления и другие вещи, которые напрямую не связаны с моей моделью и, наконец, мои models.py, там я помещаю все методы, которые модифицируют экземпляры модели. – levi