You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:06:02