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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:27:37