Django API中Serializer自定义字段是否会保存至数据库?
问题1:不创建Model,直接使用serializer.Serializer定义字段时,这些字段会保存到数据库吗?
不会。Serializer的核心作用是数据的序列化(把Python对象转成JSON等格式)和反序列化(把前端传来的JSON转成Python对象),它本身不具备数据库操作能力,也不会自动生成数据库表结构。没有对应的Model,就没有数据库中对应的存储表,自然无法将字段数据保存到数据库,和是否执行迁移操作无关——迁移操作本身就是基于Model来同步数据库结构的。
问题2:若已有现成数据库,在Serializer中新增字段,这些字段会保存到数据库吗?
不会。数据库的结构(表、字段)完全由Model和迁移文件控制,Serializer只是负责处理数据的格式转换,不会修改数据库结构。即使你在Serializer里新增了字段,只要Model中没有对应的字段定义,数据库里就不会自动新增这个字段,也无法将该字段的数据保存到数据库(因为没有对应的存储列)。
比如你提供的示例代码(已修正拼写/参数错误):
Model.py
class Detail(models.Model): fname = models.CharField(max_length=20) lname = models.CharField(max_length=20) mobile = models.IntegerField() email = models.EmailField(max_length=20)
Serializer.py
from rest_framework import serializers class DetailSerializer(serializers.Serializer): created_at = serializers.CharField() is_active = serializers.BooleanField() # 需要同步Model已有字段才能完成完整的序列化/反序列化 fname = serializers.CharField(max_length=20) lname = serializers.CharField(max_length=20) mobile = serializers.IntegerField() email = serializers.EmailField(max_length=20)
示例中Serializer新增的created_at和is_active字段,因为Model中没有对应定义,数据库的Detail表不会自动新增这两个字段,也无法将这两个字段的值保存到数据库。
问题3:若不基于Model创建Serializer,其字段是否会保存到数据库?如果会,无需迁移是如何实现的?
不会自动保存到数据库。不基于Model的Serializer,只是处理数据格式的工具,没有绑定任何数据库表,除非你在视图中手动编写代码,将Serializer验证后的数据写入某个已存在的数据库表(此时该表必须是由Model定义并通过迁移创建好的)。但这属于你自己编写的业务逻辑,不是Serializer的默认行为,而且这种情况下依然需要对应的Model和迁移来保证数据库表存在,不存在“无需迁移”就能把字段存到数据库的情况——数据库的表结构必须通过Model+迁移来定义或修改,Serializer做不到这一点。
内容的提问来源于stack exchange,提问作者janezio

