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 字典以保持原边界行为。
46 lines
1.5 KiB
Python
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
|