Автоматическое заполнение поля возраста в postgres DB с датой рождения в модуле django

#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 . Или установка свойства или метода в модели.