一、模型 Meta 汇总(Model.Meta)

写在 models 模型内部,控制数据库、索引、后台展示、权限。

参数 作用 示例
db_table 自定义数据库表名 db_table = "sys_survey_template"
verbose_name Admin 后台单数名称 verbose_name = "问卷模板"
verbose_name_plural Admin 后台复数名称 verbose_name_plural = "问卷模板"
ordering 默认排序,- 代表降序 ordering = ["-create_time", "id"]
abstract 抽象基类,不生成表,仅用于继承 abstract = True
managed False 不参与迁移,对接旧数据库 managed = False
proxy 代理模型,复用原表,只扩展方法 proxy = True
unique_together 多字段联合唯一(旧方案) unique_together = [["name", "user"]]
indexes 自定义索引(单列/联合) indexes = [models.Index(fields=["name"])]
constraints 数据库约束、检查约束、唯一约束 constraints = [CheckConstraint(check=Q(age__gte=0), name="age_check")]
permissions 自定义模型权限 permissions = [("view_report", "查看报表")]
default_permissions 修改默认 add/change/delete/view 权限 default_permissions = ["add","view"]
get_latest_by latest()/earliest() 默认排序字段 get_latest_by = "create_time"

二、ModelForm Meta 汇总

用于表单校验、后台页面渲染。

参数 作用 示例
model 绑定对应模型 model = SurveyTemplate
fields 展示/校验字段,__all__ 代表全部 fields = ["name", "desc"]
exclude 排除字段,不和 fields 共用 exclude = ["id"]
widgets 自定义前端控件样式 widgets = {"name": TextInput(attrs={"class":"form-control"})}
labels 自定义字段中文名 labels = {"name": "模板名称"}
help_texts 字段提示文案 help_texts = {"name": "请输入模板名称"}
error_messages 自定义校验报错信息 error_messages = {"name":{"required":"名称不能为空"}}

三、DRF Serializer Meta 汇总

控制接口序列化、入参、出参规则。

参数 作用 示例
model 绑定模型 model = SurveyTemplate
fields 序列化输出字段 fields = ["id", "name"]
exclude 排除字段 exclude = ["password"]
read_only_fields 只读字段,仅返回不提交 read_only_fields = ["id", "create_time"]
write_only_fields 只写字段,只接收不返回 write_only_fields = ["password"]
depth 外键自动展开层级(0-10) depth = 1
extra_kwargs 批量配置字段规则 extra_kwargs = {"name":{"required":True}}

四、DRF ModelViewSet 静态类属性(高频)

属性名称 作用说明 示例代码
queryset 视图基础静态数据集 queryset = SurveyTemplate.objects.all()
serializer_class 默认序列化器 serializer_class = SurveyTemplateSerializer
permission_classes 接口权限列表 permission_classes = [permissions.IsAuthenticated]
authentication_classes 接口认证方式 authentication_classes = [TokenAuthentication]
pagination_class 分页配置类 pagination_class = StandardPagePagination
throttle_classes 接口限流规则 throttle_classes = [UserRateThrottle]
filter_backends 过滤器后端 filter_backends = [SearchFilter, OrderingFilter]
search_fields 模糊搜索字段 search_fields = ["name", "title"]
ordering_fields 前端可排序字段 ordering_fields = ["id", "create_time"]
ordering 列表默认排序 ordering = ["-create_time"]
lookup_field 详情查询主键(默认pk) lookup_field = "uuid"
lookup_url_kwarg 路由参数名 lookup_url_kwarg = "template_uuid"

五、DRF ViewSet 高频重写方法(业务通用)

1. get_queryset(最高频:动态数据过滤)

def get_queryset(self):
    qs = super().get_queryset()
    # 只查询当前用户自己的数据
    return qs.filter(creator=self.request.user)

2. get_serializer_class(不同接口使用不同序列化器)

def get_serializer_class(self):
    if self.action == "retrieve":
        return SurveyTemplateDetailSerializer
    if self.action == "create":
        return SurveyTemplateCreateSerializer
    return SurveyTemplateSerializer

3. get_serializer_context(向序列化器传递额外参数)

def get_serializer_context(self):
    ctx = super().get_serializer_context()
    ctx["company_id"] = self.request.user.company_id
    return ctx

4. get_permissions(动态权限控制)

def get_permissions(self):
    if self.action in ["list", "retrieve"]:
        return [permissions.AllowAny()]
    return [permissions.IsAuthenticated()]

5. perform_create(新增时自动填充字段)

def perform_create(self, serializer):
    # 接口层逻辑,仅当前视图生效
    serializer.save(creator=self.request.user)

6. perform_update(更新时自动填充字段)

def perform_update(self, serializer):
    serializer.save(updater=self.request.user)

7. perform_destroy(软删除实现)

def perform_destroy(self, instance):
    instance.is_deleted = True
    instance.save()

8. get_object(单条数据权限校验)

def get_object(self):
    obj = super().get_object()
    if obj.creator != self.request.user:
        raise PermissionDenied("无权操作该数据")
    return obj

9. get_authenticators(动态认证配置)

def get_authenticators(self):
    if self.action == "list":
        return []
    return [JWTAuthentication()]

10. get_throttles(动态限流)

def get_throttles(self):
    if self.request.user.is_authenticated:
        return [UserRateThrottle()]
    return [AnonRateThrottle()]

11. 重写 list(自定义列表返回结构)

def list(self, request, *args, **kwargs):
    res = super().list(request, *args, **kwargs)
    res.data["total_count"] = self.get_queryset().count()
    return res

12. 重写 retrieve(详情页附加业务逻辑)

def retrieve(self, request, *args, **kwargs):
    instance = self.get_object()
    instance.view_count += 1
    instance.save()
    return super().retrieve(request, *args, **kwargs)

六、Model 层常用重写方法(全局生效)

写在 models 模型内部,接口、Admin、脚本、定时任务全部生效;通用逻辑推荐放在模型层。

1. save() 保存钩子(最高频)

新建/更新都会触发,可以区分新增、更新场景。

def save(self, *args, **kwargs):
    if not self.pk:
        # 仅新建执行
        pass
    else:
        # 仅更新执行
        pass
    super().save(*args, **kwargs)

2. delete() 删除钩子

用于全局软删除、清理关联文件、刷新缓存。

def delete(self, *args, **kwargs):
    # 全局软删除
    self.is_deleted = True
    self.save()
    # 需要物理删除则打开下方代码
    # super().delete(*args, **kwargs)

3. clean() 模型内业务校验

调用 full_clean() 触发,ModelForm、Admin自动执行,用于跨字段校验。

def clean(self):
    from django.core.exceptions import ValidationError
    if self.start_time >= self.end_time:
        raise ValidationError("开始时间不能晚于结束时间")

4. str 对象格式化展示

调试打印、Admin后台、外键下拉展示名称。

def __str__(self):
    return self.name

5. get_absolute_url 生成对象详情地址

Admin后台可快速跳转前端页面。

def get_absolute_url(self):
    from django.urls import reverse
    return reverse("survey-template-detail", args=[self.pk])

重要区分perform_create/perform_update 只作用于当前视图;Model重写方法全局所有调用处生效。

七、DRF Serializer 常用重写方法

1. validate_xxx(单字段独立校验)

def validate_phone(self, value):
    if len(value) != 11:
        raise serializers.ValidationError("手机号必须为11位")
    return value

2. validate(多字段联合校验)

def validate(self, attrs):
    if attrs["start_time"] >= attrs["end_time"]:
        raise serializers.ValidationError("开始时间不能晚于结束时间")
    return attrs

3. create(自定义创建逻辑,处理多对多、嵌套数据)

def create(self, validated_data):
    tags_data = validated_data.pop("tags", [])
    instance = super().create(validated_data)
    instance.tags.set(tags_data)
    return instance

4. update(自定义更新逻辑)

def update(self, instance, validated_data):
    tags_data = validated_data.pop("tags", None)
    instance = super().update(instance, validated_data)
    if tags_data is not None:
        instance.tags.set(tags_data)
    return instance

八、Action 动作对照表

self.action 请求方式 功能
list GET 查询列表
retrieve GET 查询单条详情
create POST 新增数据
update PUT 全量更新
partial_update PATCH 局部更新
destroy DELETE 删除数据

九、模型字段通用高频参数

参数 作用
null=True 数据库字段允许为空
blank=True 表单/序列化校验允许为空(字符串优先使用)
default 字段默认值
unique=True 字段唯一约束
db_index=True 创建单列索引
editable=False Admin后台禁止编辑

十、DRF 序列化器字段高频参数

参数 作用
required 是否必填入参
read_only 只读,仅返回不接收提交
write_only 只写,仅接收不返回
source 字段映射(支持跨模型 source="user.name"
allow_null 允许传入null

十一、终极开发规范(必记)

  1. 逻辑优先级:重写方法 > 静态类属性
  2. 接口新增/更新填充字段优先使用 perform_create / perform_update,避免污染全局
  3. 软删除区分场景:接口层重写 perform_destroy;全局统一策略重写 Model.delete()
  4. 数据权限过滤统一在 get_queryset / get_object 处理
  5. 一套接口多种输出结构,使用 get_serializer_class 切换序列化器
  6. APIView 没有 querysetserializer_class 等ViewSet属性

十二、项目高频背诵清单

  • 6大视图必重写:get_queryset、get_serializer_class、get_permissions、get_serializer_context、perform_create、perform_destroy
  • 5大模型必重写:save、delete、clean、__str__、get_absolute_url
  • 4大序列化器重写:validate_xxx、validate、create、update
  • 3大核心Meta:Model.Meta、ModelForm.Meta、Serializer.Meta
  • 核心视图静态属性:queryset、serializer_class、权限、过滤、排序、分页