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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:10:26