如何在Django REST Framework中为创建的模型自动关联当前登录用户
需求实现:仅登录用户可创建文章并自动关联当前用户
现有代码
Article模型
from django.db import models from django.contrib.auth.models import User class Article(models.Model): headline = models.CharField(max_length=150) body = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) pub_date = models.DateField(auto_now_add=True) pub_time = models.TimeField(auto_now_add=True) # 需要添加的字段 # location # byline -> 标注文章作者的行 # conclusion # tags def __str__(self): return self.headline
创建文章的视图
@api_view(['POST']) def create(request): if request.method == 'POST': serializer = ArticleSerializer(data = request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
序列化器
from rest_framework import serializers from . models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = '__all__'
解决方案
1. 添加登录权限验证并自动设置作者
修改视图,引入权限类限制仅登录用户访问,同时在保存时将当前登录用户赋值给author字段:
from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework import status from rest_framework.response import Response from .serializers import ArticleSerializer @api_view(['POST']) @permission_classes([IsAuthenticated]) # 限制仅登录用户可调用该接口 def create(request): if request.method == 'POST': serializer = ArticleSerializer(data=request.data) if serializer.is_valid(): # 自动将当前登录用户设为文章作者 serializer.save(author=request.user) return Response(serializer.data, status=status.HTTP_201_CREATED) # 验证失败时返回错误信息 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
2. 调整序列化器(可选但推荐)
由于author字段由后端自动填充,无需前端传入,建议将其设为只读字段或从序列化字段中排除,避免前端误传:
方式一:设置为只读字段
from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ['headline', 'body', 'pub_date', 'pub_time', 'author'] read_only_fields = ['author', 'pub_date', 'pub_time'] # 这些字段由后端自动处理
方式二:排除author字段
from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article exclude = ['author'] # 前端无需传递该字段,后端自动设置
3. 功能验证
- 未登录状态下调用接口,会返回
401 Unauthorized,提示需要登录认证。 - 登录后调用接口,无需传入
author参数,后端会自动将当前用户关联为文章作者。
内容的提问来源于stack exchange,提问作者devMe
相关产品推荐
相关产品推荐

