Django REST Framework自动填充created_by外键遇NOT NULL约束错误
解决方案
1. 确认Clinic模型的外键定义
确保created_by外键正确关联自定义用户模型,并且设置了非空约束:
from django.conf import settings from django.db import models class Clinic(models.Model): # 其他业务字段示例 name = models.CharField(max_length=100) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False, blank=False, verbose_name="创建人" )
同时检查项目settings.py中已配置自定义用户模型:
AUTH_USER_MODEL = "your_app.YourCustomUser"
2. 调整序列化器配置
保持created_by为ReadOnlyField(避免前端传入值),同时确保序列化器字段列表包含该字段:
from rest_framework import serializers from .models import Clinic class ClinicSerializer(serializers.ModelSerializer): created_by = serializers.ReadOnlyField(source='created_by.id') # 按需展示用户ID或其他字段 class Meta: model = Clinic fields = ["id", "name", ..., "created_by"] # 务必包含created_by字段
3. 修正视图的创建逻辑
ListCreateAPIView不会自动调用自定义的create_clinic方法,需重写框架规定的perform_create方法,将当前认证用户传入模型实例:
from rest_framework.generics import ListCreateAPIView from rest_framework.permissions import IsAuthenticated from .models import Clinic from .serializers import ClinicSerializer class ClinicListCreateView(ListCreateAPIView): queryset = Clinic.objects.all() serializer_class = ClinicSerializer permission_classes = [IsAuthenticated] # 强制认证用户才能创建 def perform_create(self, serializer): # 直接将当前请求的用户绑定到created_by字段 serializer.save(created_by=self.request.user)
4. 处理迁移与数据库数据
如果是新增created_by字段后出现的问题,需确保迁移正确处理现有数据:
- 生成迁移时,若数据库已有Clinic数据,会提示设置默认值,可指定一个现有用户ID作为临时默认,执行迁移后再批量更新历史数据的
created_by字段 - 重新执行迁移命令:
python manage.py makemigrations python manage.py migrate
5. 验证要点
- 确保请求携带有效的认证信息(如Token、Session),避免
request.user为匿名用户 - 创建Clinic后,检查数据库中
clinics_clinic表的created_by_id字段是否已正确填充
内容的提问来源于stack exchange,提问作者user22002675
相关产品推荐
相关产品推荐

