Django序列化器是否支持主键author_slug、phrase_slug的自动校验?
Django DRF 主键校验与自定义接口实现方案
核心结论
DRF(Django REST Framework)序列化器自带主键存在性自动校验能力,无需手动编写重复的查询校验逻辑。
具体实现步骤
1. 新增请求参数校验序列化器
在serializers.py中新增专门用于校验该接口参数的序列化器,使用PrimaryKeyRelatedField字段即可触发自动主键校验:
# serializers.py 新增代码 from rest_framework import serializers from .models import Author, Phrase class RelationshipCheckSerializer(serializers.Serializer): # 自动校验传入值是否为Author表的有效主键(Author主键为slug字段) author_slug = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all()) # 自动校验传入值是否为Phrase表的有效主键(Phrase默认主键为id) phrase_slug = serializers.PrimaryKeyRelatedField(queryset=Phrase.objects.all())
PrimaryKeyRelatedField会自动匹配对应模型的主键字段,不需要额外指定匹配规则,校验不通过时会自动返回标准化的400错误提示。
2. 新增自定义GET接口
在views.py中新增接口逻辑,建议使用DRF的action装饰器挂载到现有视图集上,避免重复配置路由:
# views.py 新增代码 from rest_framework.decorators import action from rest_framework.response import Response from .serializers import RelationshipCheckSerializer # 可挂载到任意现有ViewSet下,示例挂载到AuthorViewSet class AuthorViewSet(viewsets.ModelViewSet): serializer_class = AuthorSerializer queryset = Author.objects.all() @action(methods=['get'], detail=False, url_path='exist-relationship-bwt-author-phrase') def check_relationship(self, request): # 校验GET请求的查询参数 ser = RelationshipCheckSerializer(data=request.query_params) ser.is_valid(raise_exception=True) # 校验通过后直接获取对应模型实例 author = ser.validated_data['author_slug'] phrase = ser.validated_data['phrase_slug'] # 判断二者是否存在关联关系 is_related = phrase.author_slug == author return Response({"exist": is_related})
调用说明
接口请求格式为:GET /{author接口前缀}/exist-relationship-bwt-author-phrase?author_slug=xxx&phrase_slug=xxx
不需要传递请求体,GET参数放在URL查询串中即可。
内容的提问来源于stack exchange,提问作者pedro.caicedo.dev
相关产品推荐
相关产品推荐

