如何处理Django Rest Framework中的模型更改?

问题描述:

这不是一个特定用例的问题,而是我在做API时注意到的事情,特别是使用Django和Django Rest Framework。如何处理Django Rest Framework中的模型更改?

几个月前我遇到了我为客户项目维护的API的问题。

比方说,我们有以下模型:

class Person: 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 

然后,对应串行:

class PersonSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 
     fields = '__all__' 

当然,其相应的视图集中和路由指向它:

http://localhost:8000/api/v1/persons/ 

请注意,这是我的API的第一个版本。

一切OK,在这一点上,对吧?

现在,我的客户要求,我们需要接收人的全名,而不是单独的名字和姓氏...

像预想的那样,我不得不改变我的模式是:

class Person: 
    full_name = models.CharField(max_length=200) 

使用此版本的API有3种不同的客户端(移动应用程序)。显然,我不想更改我的API,而是希望将新方法放入新版本。下面

但是第一个版本的串行连接与型号,所以在这一点上的API 的第一个版本已经改变

我期待的答案读什么是你们如何处理这个问题, Django以及我应该如何使用同一个堆栈为我的下一个项目采取的方式。

编辑:我的问题的目标是了解是否更好地将API与模型分离。我已经提出了一个非常基本的例子,但有些情况下事情变得更加复杂。例如,我需要修改M2M关系以使用直通选项,以便将更多字段添加到中间表。

它的问题类型可能被标记为“推荐水平”,但无论如何。

首先,您需要使用full_name字段扩展您的模型。如果您需要能够写入模式从API提供full_name,那么你需要与现场扩展否则可以应对property

@property 
def full_name(self): 
    return '{} {}'.format(self.first_name, self.last_name) 

那么你也可以包括在串行

class PersonSerializer(serializers.ModelSerializer): 
    full_name = serializers.CharField() # if you have property 
    class Meta: 
     model = Person 
     fields = '__all__' 

场由于你的类字段名称和序列化字段名称会匹配你不必担心。

因此,有额外的领域不会打破你的客户,并满足你的大客户。

+0

你是什么意思的“推荐smth”?在复杂情况下要做什么,例如,我必须更改M2M字段以使用直通选项,因为我需要中间表中的更多字段。我的问题的目标是理解是否更好地将API与模型分离... –