2015-02-28 3 views
0

Я пишу код для приложения django, и мне нужно поле модели, которое исходит из значения других 2 той же модели.Override save vs Пользовательское поле в Django

Я создал поле, потому что хочу сохранить его значение в БД и не оставлять его значение так же, как закодированная логика в представлениях/admin. До сих пор я сохранял все значения через демографический скрипт, который вызывал метод модели перед сохранением.

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как создать решение, которое можно вызывать из сценария популяции (называемого ежедневным cron-активностью) и структуры django по умолчанию (в основном, admin и views).

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

Должен ли я создать настраиваемое поле или переопределить метод сохранения? Можно ли избежать присвоения значения полю при его создании? Я мог бы написать по умолчанию и blank = true, но не гарантирует, что это значение верное.

Models.py

class Valores(models.Model): 
    TARIFAS = (
     ('1', '2.0A'), 
     ('2', '2.0DHA'), 
     ('3', '2.0DHS'), 
     # (None, 'Elije una tarifa') 
    ) 

    PERIODO_TAR = (
     ('1', 'Punta'), 
     ('2', 'Valle'), 
     ('3', 'Supervalle'), 
     # (None, 'Elije una tarifa') 
    ) 

    PERIODO_HOR = (
     ('1', '00-01'), 
     ('2', '01-02'), 
     ('3', '02-03'), 
     ('4', '03-04'), 
     ('5', '04-05'), 
     ('6', '05-06'), 
     ('7', '06-07'), 
     ('8', '07-08'), 
     ('9', '08-09'), 
     ('10', '09-10'), 
     ('11', '10-11'), 
     ('12', '11-12'), 
     ('13', '12-13'), 
     ('14', '13-14'), 
     ('15', '14-15'), 
     ('16', '15-16'), 
     ('17', '16-17'), 
     ('18', '17-18'), 
     ('19', '18-19'), 
     ('20', '19-20'), 
     ('21', '20-21'), 
     ('22', '21-22'), 
     ('23', '22-23'), 
     ('24', '23-24'), # (None, 'Elije un periodo horario') 
    ) 

    per_hor = models.IntegerField(
     'periodo horario', 
     choices=PERIODO_HOR 
    ) 
    per_tar = models.IntegerField(
     'periodo tarifario', 
     choices=PERIODO_TAR 
    ) 
    tar = models.IntegerField(
     'tarifa', 
     choices=TARIFAS 
    ) 

    def periodo_tarifario(self): 
     # Devuelve el periodo tarifario 
     if self.tar == 1: 
      return 1 

     elif self.tar == 2: 
      if 12 < self.per_hor < 23: 
       return 1 
      else: 
       return 2 

     elif self.tar == 3: 
      if 1 < self.per_hor < 8: 
       return 3 
      elif 8 < self.per_hor < 14 or self.per_hor == 1 or self.per_hor == 24: 
       return 2 
      else: 
       return 1 
+0

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

+0

Я хочу отобразить его на сайте администратора, но также через шаблоны. Методы можно вызвать в шаблонах и на сайте модели администратора, но fieldsets и list_filter в admin.py поддерживают только поля поддержки, поэтому я не могу отображать их в форме chage или фильтровать по ее значению. Addiotionally Я могу отображать «имена» (например, выборы) в некоторых местах (например, admin) и использовать его значение в других местах (в некоторых шаблонах): – XcodeX

ответ

1

Как об использовании следующую структуру:

class MyModel(models.Model): 
    A_Field=models.IntegerField() 
    B_Field=models.IntegerField() 
    C_Field=models.IntegerField(null=True, blank=True)#this is the generated field 

    def get_C(self): 
     return self.A_Field+self.B_Field 

    def save(self, force_insert=False, force_update=False): 
     self.C_Field=self.get_C() 
     super(MyModel, self).save(force_insert, force_update) 

Назначение уже правильное значение по умолчанию (например, по умолчанию = get_C в определении поля) потерпит неудачу, как A_Field и B_Field не будет иметь значения в той точке, в которой он вызывается. Если вам нужно, чтобы это было немедленно оценено, как только вы измените A и B в форме, вам нужно будет использовать JS для этого.

+0

Спасибо за ваш ответ! Таким образом, лучший способ генерировать поле, основанное на методе, вызывает его метод, который отменяет процесс сохранения. Я попробую и отброшу метод пользовательских методов. – XcodeX

Смежные вопросы