Files
test/app/model/__pycache__/student.cpython-313.pyc
T

45 lines
7.4 KiB
Plaintext
Raw Normal View History

2026-09-21 19:03:31 +08:00
ó
1‡ªjÜãóš•SrSSKJr SSKJr SSKJrJrJrJ r SSK
J r J r J
r
SSKJrJrJr SSKJrJrJr SSKJr "S S
\\\5rg ) uN学生表(需求 2.1),系统的主表。
关于「年龄�的一个设计��
--------------------------------------------------------------------------
需求里把年龄列�了学生字段。这里**�� age 字段**,�存 birth_date:
* 年龄 = 按今天算出�的派生值。今天是 24 �,明年今天还是 24 就错了,
必须�定时任务去刷,多一个必定会�的字段。
* 需�"按年龄筛选"的场景(需求 2.6.1)用 SQL 表达�算:
``app.core.utils.age_expression()`` 把 birth_date 折�年数�与 WHERE。
* 出��时给 birth_date 和算好的 age,�端拿�直接用。
唯一例外:录入时对方�知�年龄�知�生日,入��许�传 age,
service 会用 ``guess_birth_date()`` 折算一个��生日并标记 ``birth_date_estimated=True``。
é)Ú annotations)Údate)ÚDateÚ
ForeignKeyÚStringÚText)ÚMappedÚ
mapped_columnÚ relationship)ÚBaseÚSoftDeleteMixinÚTimestampMixin)Ú GENDER_TEXTÚSTUDENT_STATUS_TEXTÚ
StudentStatus)Úcalc_agecóž•\rSrSr%SrSS0r\"SSS9rS\S'\"\ "S 5SS
SS S 9r
S
\S'\"\ "S 5S
SSS9r S
\S'\"SS
SSS9r S\S'\"\
SS9rS\S'\"SS
SS9rS\S'\"\ "S5SS9rS \S!'\"\ "S"5S#S9rS \S$'\"\ "S5S%S9rS \S&'\"\ "S'5S(S9rS \S)'\"\
S*S9rS\S+'\"\
S,S9rS\S-'\"\ "S'5S.S9rS \S/'\"\ "S 5S0S9rS \S1'\"\"S25SS3S49rS5\S6'\"\"S75SS8S49rS5\S9'\"\"\R:5S
SS:S9rS\S;'\"\S<S9r S \S='\!"S>S?\/S@9r"SA\SB'\!"S?SC9r#SD\SE'\!"SSFSGSHSI9r$SJ\SK'\!"SS
S?SL9r%SM\SN'\&SZSOj5r'\&S[SPj5r(\&S\SQj5r)\&S[SRj5r*\&S[SSj5r+\&S[STj5r,\&S]SUj5r-\&S^SVj5r.\&S]SWj5r/SXr0gY)_ÚStudentéÚstudentÚcommentu学生基本信æ�¯è¡¨T)Ú primary_keyÚ
autoincrementz Mapped[int]ÚidéFu'å­¦å�·ï¼ˆæŒ‰è§„则生æˆ�,é�žè‡ªå¢žï¼‰)ÚuniqueÚnullableÚindexrz Mapped[str]Ústu_nouå§“å��)rrrÚnameéu性别 1=ç”· 2=女)ÚdefaultrrrÚgenderu6出生日期(年龄由此实时计算,ä¸�è�½åº“))rzMapped[date | None]Ú
birth_dateru6生日是å�¦ä¸ºæŒ‰å¹´é¾„推算的å� ä½�值 0=å�¦ 1=是)r"rrÚbirth_date_estimatedé<uç±�è´¯zMapped[str | None]Ú native_placeéPu 毕业院校Úgraduate_schoolu专业Úmajoréuå­¦åŽ†Ú educationu å…¥å­¦æ—¶é—´Ú enroll_dateu 毕业时间Ú
graduate_dateu è�”系电è¯�Úphoneu 身份è¯�å�·Úid_cardzclazz.idu 所属ç�­çº§)rrzMapped[int | None]Úclass_idz
advisor.idu 顾问编å�·Ú
advisor_idu*状æ€� 1=在读 2=进入就业 3=已就业Ústatusu'备注(æˆ�绩预警会自动追加)ÚremarkÚstudentsÚjoined)Úback_populatesÚlazyÚ foreign_keyszMapped['Clazz']Úklass)r8zMapped['Advisor']ÚadvisorÚselectinzScore.exam_seqzall, delete-orphan)r7r8Úorder_byÚcascadezMapped[list['Score']]Úscores)r7Úuselistr8zMapped['Employment']Ú
employmentcó,•[UR5$©N)rr$©Úselfs Úapp\model\student.pyÚageÚ Student.ageNs€ä˜Ÿ™Ó(Ð(ócóB•[R"UR5$rC)rÚgetr#rDs rFÚ gender_textÚStudent.gender_textRs€ä�Š˜tŸ{™{Ó+Ð+rIcóD•[R"URS5$)Nu未知)rrKr3rDs rFÚ status_textÚStudent.status_textVs€ä"×&Ò& t§{¡{°HÓ=Ð=rIcóˆ•UR(a0URRS:XaURR$S$©Nr)r:Úis_delr rDs rFÚ
class_nameÚStudent.class_nameZs,€à"&§*§*°·±×1BÑ1BÀaÓ1Gˆt�z‰z�‰ÐQÈTÐQrIcóˆ•UR(a0URRS:XaURR$S$rR)r:rSÚclass_norDs rFrWÚStudent.class_no^s/€à&*§j§j°T·Z±Z×5FÑ5FÈ!Ó5Kˆt�z‰z×"Ñ"ÐUÐQUÐUrIcóˆ•UR(a0URRS:XaURR$S$rR)r;rSr rDs rFÚ advisor_nameÚStudent.advisor_namebs/€à$(§L§L°T·\±\×5HÑ5HÈAÓ5Mˆt�|‰|× Ñ ÐWÐSWÐWrIcóz•[URVs/sHoRS:XdMUPM sn5$s snfrR)Úlenr?rS©rEÚss rFÚ score_countÚStudent.score_countfs+€ä˜tŸ{š{Ó<š{˜!¯h©h¸!©m—A™{Ñ<Ó=Ð=ùÒ<s”8«8cóþ•URVs/sH8oRS:XdMURcM#[UR5PM: nnU(a![ [ U5[
U5- S5$S$s snf)Nré)r?rSÚscoreÚfloatÚroundÚsumr])rEr_Úvalids rFÚ avg_scoreÚStudent.avg_scorejs[€à)-¯ªÓ^ª A¿¹ÀA¹
“È!Ï'É'“”�q—w‘w–©ˆÐ^Þ49Œu”S˜“Z¤# e£*Ñ,¨aÓ0ÐC¸tÐCùò_s�A:¦ A:µA:cóž•[URVs/sH(oRS:XdMURS:XdM&UPM* sn5$s snf)Nrr!)r]r?rSÚflagr^s rFÚ
fail_countÚStudent.fail_countos7€ä˜tŸ{š{ÓLš{˜!¯h©h¸!©m“AÀÇÁÈ!Á —A™{ÑLÓMÐMùÒLs”A