在Django中根据请求自动添加新的model_field || DRF

时间:2018-08-07 12:28:20

标签: python django django-models django-rest-framework

我有一个简单的REST-API项目。

这是我的模特:

class Human(Model):
    height = IntegerField()

我有一个序列化器:

class HumanSerializer(ModelSerializer):
    id = IntegerField(read_only=True)
    height = IntegerField(required=True)

非常简单明了! 但!我想要的是能够向我的人员模型添加其他字段,并自动将这些更改迁移到数据库,并向序列化器添加一个与新模型字段相关的新字段。

  

例如,假设客户想要添加一个新字段,称为   “重量”。因此开发人员不会做任何事情,因为后端会   自动收到该请求,将自动创建一个新的   字段转换为人体模型,自动创建一个新字段以序列化,   并自动创建与这些更改相关的migration.py文件。

有没有办法实现这一目标?最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

如果Human模型与模型之间没有 no 关系(例如ForeignKeyManyToManyFieldOneToOneField等),则您只需使用fields = '__all__'来指定:

class HumanSerializer(ModelSerializer):
    class Meta:
        model = Human
        fields = '__all__' 

但是与其他模型的关系仍然必须手动包括,因为可以通过多种方法来处理:

  1. 忽略它们;
  2. 通过将id(或URI)添加到对象;
  3. 也通过序列化相关对象;
  4. ...

也许序列化相关对象看起来像是一个简单的选择,但是如果例如某个对象(可能是间接指向)指向自身,则可能导致无限递归,这意味着该对象的序列化包含该对象的序列化。即使它不创建递归循环,它仍然可以极大地放大响应,因此即使无法进行递归,在单个响应中传输数千个对象可能也不理想。最后,可能不建议这样做的原因是,通过这些关系,我们可能最终进入存储敏感信息的模型(例如,如果对象链接到链接到一个或多个链接的模型用户,那么您的API就会公开用户的详细信息),这可能不是一个好主意。

例如,如果Human引用了一个(假设的)Ssn对象,那么您也可以使用以下方法序列化该对象:

class HumanSerializer(ModelSerializer):
    ssn = SsnSerializer(read_only=True)

    class Meta:
        model = Human
        fields = '__all__'