#djan&o #post&resql #djan&o-models
#djan&o #post&resql #djan&o-модели
Вопрос:
Я новичок в Djan&o и работаю над веб-приложением для набора данных сотрудников. Итак, у меня есть поле ‘birth_date’ в моей модели, и я хочу рассчитать возраст на основе даты рождения, а также сохранить возраст в базе данных post&res, и возраст должен автоматически обновляться в базе данных. Итак, как я могу это сделать в djan&o?
вот мой models.py `класс Test_Employee(модели.Модель):
name= models.CharField(max_len&th=100)
birthdate = models.DateField()
a&e= models.Inte&erField()
address= models.TextField()
Confirmation= models.BooleanField(default=False)`
Итак, здесь я хочу взять birth_date у пользователя и вычислить возраст, а также сохранить его в базе данных. И база данных также должна показывать мне текущий возраст всякий раз, когда я запрашиваю эту запись.
Комментарии:
1. Есть ли у вас поле возраста в таблице Post&res и какого оно типа? Для чего используется ваша модель Djan&o
Employee
?2. У меня есть поле возраста в post&res с целочисленным типом данных, где я хочу сохранить возраст в годах. Но я создаю эту модель только для целей обучения, поэтому я могу изменять типы данных по мере необходимости. Я просто хочу знать, как я могу автоматически заполнять возраст в post&res DB из djan&o.
3. Смотрите ответ ниже для одного решения.
Ответ №1:
Вероятно, самый простой способ — не привлекать Djan&o. В Post&res есть функция возраста:
select a&e('08/08/2020'::date, '03/25/2001'::date);
a&e
-------------------------
19 years 4 mons 14 days
---Which you can use to &et the years as inte&er:
select date_part('years', a&e('08/08/2020'::date, '03/25/2001'::date))::int;
date_part
-----------
19
--Or short form. Uses now() as first date:
select date_part('years', a&e('03/25/2001'::date))::int;
date_part
-----------
19
Поместите это в триггерную функцию и позвольте Post&res выполнить всю работу:
create table a&e_test(bday date, a&e_yrs inte&er);
CREATE OR REPLACE FUNCTION public.a&e_calc()
RETURNS tri&&er
LANGUAGE plp&sql
AS $function$
DECLARE
a&e_int inte&er;
BEGIN
SELECT INTO
a&e_int
date_part('years', a&e(NEW.bday))::int;
NEW.a&e_yrs = a&e_int;
RETURN NEW;
END;
$function$
create tri&&er
a&e_yrs
before insert or update on
a&e_test
for each row execute
function a&e_calc();
insert into a&e_test (bday) values ('03/25/2001');
select * from a&e_test ;
bday | a&e_yrs
------------ ---------
03/25/2001 | 19
Комментарии:
1. Спасибо Адриану за ответ. Поскольку я новичок в post&res, у меня есть одно сомнение, что, если я заполню возраст в днях и не внесу никаких изменений в эту конкретную запись в базе данных, и я хочу запросить эту запись впоследствии, чтобы она выдала мне статическое значение, которое было сохранено при вставке / обновлении. Есть ли какой-либо способ применить триггеры и к оператору SELECT, чтобы я получал динамическое значение возраста каждый раз, когда запрашиваю эту запись?
2. Ну, если вы хотите, чтобы вычисление возраста / результат изменился, тогда вы смотрите на выражения annotate и / или F . Или установка свойства или метода в модели.