django序列化后,在POST请求时,提示(1048, “Column ‘author_id‘ cannot be null“)

本文探讨了在使用序列化器创建数据时遇到的外键字段不能为空的问题,并给出了具体的解决方案。通过增加author_id字段并在序列化器中进行序列化,成功解决了这一问题。

序列化后POST创建数据提示字段不能为空

问题前提:

# 文章模型
class Article(BaseModel):
    title = models.CharField('标题', max_length=200, unique=True)
    body = MDTextField('正文')
    views = models.IntegerField('浏览量', default=0)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        verbose_name='作者',
        blank=False,
        null=False,
        on_delete=models.CASCADE
    )
    category = models.ForeignKey(
        'Category',
        verbose_name='分类',
        blank=False,
        null=False,
        on_delete=models.CASCADE
    )

    
# 用户模型:
class User(AbstractUser):
    signature = models.CharField('个性签名', max_length=50, default='己所不欲,勿施于人')

    def __str__(self):
        return "%s" % self.username

# 序列化器
class ArticleListSerializer(serializers.ModelSerializer):
    """
    序列化文章列表,便于返回JSON数据给前端
    """
    # 嵌套用户介绍序列化器
    author = UserDescSerializer(read_only=True)

    class Meta:
        model = Article
        # fields = '__all__'   # 序列化所有字段
        fields = [
            'id',
            'title',
            'body',
            'author',
            'category',
            'created_time'
        ]
class UserDescSerializer(serializers.ModelSerializer):
    """
    用于文章列表和详情引用的嵌套序列化器
    """
    class Meta:
        model = User
        fields = [
            'id',
            'username',
            'last_login',
            'signature'
        ]
# 其中,author为外键字段

前端提交POST请求时,报错author_id不能为空

image-20221203023834357

**解决方案:**增加author_id字段并序列化

class ArticleListSerializer(serializers.ModelSerializer):
    """
    序列化文章列表,便于返回JSON数据给前端
    """
    # 嵌套用户介绍序列化器
    author = UserDescSerializer(read_only=True)
    author_id = serializers.IntegerField()   # 增加author_id字段

    class Meta:
        model = Article
        # fields = '__all__'   # 序列化所有字段
        fields = [
            'id',
            'title',
            'body',
            'author',
            'author_id',  # 增加author字段
            'category',
            'created_time'
        ]

**猜测:**序列化中的不为空的字段在POST时必须要写,而User表为django的内建用户系统,当Articel模型与其关联时会自动为进行一对多的关联,此时若要增加article,需要指定 外键字段_id 的值,故需要额外在序列化器中添加author_id字段并序列化。

但是有个疑问,为什么category不需要额外添加并序列化category_id呢?如果您知道原因,还劳烦您告知,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值