我有一个简单的REST-API项目。
这是我的模特:
class Human(Model):
height = IntegerField()
我有一个序列化器:
class HumanSerializer(ModelSerializer):
id = IntegerField(read_only=True)
height = IntegerField(required=True)
非常简单明了! 但!我想要的是能够向我的人员模型添加其他字段,并自动将这些更改迁移到数据库,并向序列化器添加一个与新模型字段相关的新字段。
例如,假设客户想要添加一个新字段,称为 “重量”。因此开发人员不会做任何事情,因为后端会 自动收到该请求,将自动创建一个新的 字段转换为人体模型,自动创建一个新字段以序列化, 并自动创建与这些更改相关的migration.py文件。
有没有办法实现这一目标?最好的方法是什么?
答案 0 :(得分:2)
如果Human
模型与模型之间没有 no 关系(例如ForeignKey
,ManyToManyField
,OneToOneField
等),则您只需使用fields = '__all__'
来指定:
class HumanSerializer(ModelSerializer):
class Meta:
model = Human
fields = '__all__'
但是与其他模型的关系仍然必须手动包括,因为可以通过多种方法来处理:
id
(或URI)添加到对象; 也许序列化相关对象看起来像是一个简单的选择,但是如果例如某个对象(可能是间接指向)指向自身,则可能导致无限递归,这意味着该对象的序列化包含该对象的序列化。即使它不创建递归循环,它仍然可以极大地放大响应,因此即使无法进行递归,在单个响应中传输数千个对象可能也不理想。最后,可能不建议这样做的原因是,通过这些关系,我们可能最终进入存储敏感信息的模型(例如,如果对象链接到链接到一个或多个链接的模型用户,那么您的API就会公开用户的详细信息),这可能不是一个好主意。
例如,如果Human
引用了一个(假设的)Ssn
对象,那么您也可以使用以下方法序列化该对象:
class HumanSerializer(ModelSerializer):
ssn = SsnSerializer(read_only=True)
class Meta:
model = Human
fields = '__all__'