参数速查表
一、模型 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 |
十一、终极开发规范(必记)
- 逻辑优先级:重写方法 > 静态类属性
- 接口新增/更新填充字段优先使用
perform_create / perform_update,避免污染全局 - 软删除区分场景:接口层重写
perform_destroy;全局统一策略重写Model.delete() - 数据权限过滤统一在
get_queryset / get_object处理 - 一套接口多种输出结构,使用
get_serializer_class切换序列化器 - APIView 没有
queryset、serializer_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、权限、过滤、排序、分页
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果