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