首页 > 解决方案 > Django REST 框架中的 {"user":["This field is required."]}

问题描述

Django 在 self.request.user 中从哪里获取用户?

执行 GET 请求时,Django 看到了 User,而执行 POST 请求时,他没有看到并抛出这样的错误。用户信息从前端在 cookie 中传输。

视图.py

from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from rest_framework import pagination
from rest_framework.response import Response
from api.models.notes import Notes
from api.serializers.notes import NotesSerializer

class FilterNotes(generics.ListCreateAPIView):
    serializer_class = NotesSerializer
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        return Notes.objects \
                .filter(user=self.request.user.id) \
                .order_by('-time')
            

模型.py

from django.contrib.auth.models import User
from django.db import models


class Notes(models.Model):
    note_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, models.CASCADE, db_column='user')
    time = models.DateTimeField(auto_now_add=True)
    message = models.TextField(max_length=50, blank=True, null=True)

标签: pythondjangodjango-rest-framework

解决方案


覆盖perform_create视图的方法并将用户传递给序列化程序进行保存。

def perform_create(self, serializer):
    serializer.save(user=self.request.user)

根据需要,用户字段在创建新记录时也应该有一个值。

class FilterNotes(generics.ListCreateAPIView):
    serializer_class = NotesSerializer
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        queryset = Notes.objects.filter(user=self.request.user)\
            .order_by('-time')
        return queryset
    
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

推荐阅读