Files
TermiNexus 99fd632bf1 refactor(custom-apps): doc/invite/sve/community 视图裸 ORM 收敛进各 app Manager
doc:DocManager 新增 QueryDocuments/QuerySeries 返回查询集,视图 get_queryset 改为委托;invite:新增 InviteManager(QuerySet/GetByInviteID/Create);sve:新增 SveManager(QuerySet/GetByCandidates/Upsert 支持 CreateDefaults);community:新增 CommunityManager(板块/分类/帖子/回复/点赞共 20 处,ToggleLike 封装点赞切换与计数同步,聚合查询保留原 values_list+annotate)。

视图层不再直接操作 ORM,类级 queryset 属性保留(DRF 必需);QueryPosts 收 Filters 字典以保持原边界行为。
2026-09-14 06:47:01 +08:00

46 lines
1.5 KiB
Python

"""模块:SVE 安全漏洞百科数据访问层
SveID 为 5 字节二进制主键,存量存在「16 字节补零」「UTF-8 文本字节」等历史形态,
按候选顺序回退匹配的逻辑收敛在此,视图层不直接操作 ORM。所有方法遵循帕斯卡命名法。
"""
from .models import SVEBase
class SveManager:
"""漏洞百科管理器"""
@staticmethod
def QuerySet():
"""基础查询集(供 DRF queryset 与列表筛选复用)"""
return SVEBase.objects.all()
@staticmethod
def GetByCandidates(Candidates):
"""按候选主键依次匹配(规范 5 字节 → 旧补零 16 字节 → 旧 UTF-8 字节)
全部候选均不存在时返回 None。
"""
for Candidate in Candidates:
try:
return SVEBase.objects.get(SveID=Candidate)
except SVEBase.DoesNotExist:
continue
return None
@staticmethod
def Upsert(SveID, Defaults, CreateDefaults=None):
"""按 SveID 覆盖写入
CreateDefaults 仅在新建时写入(如 SveCreateTime),不覆盖存量值。
Returns:
(实例, 是否新建)
"""
instance, created = SVEBase.objects.update_or_create(SveID=SveID, defaults=Defaults)
if created and CreateDefaults:
for Field, Value in CreateDefaults.items():
setattr(instance, Field, Value)
instance.save(update_fields=list(CreateDefaults))
return instance, created