如何处理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__'
场由于你的类字段名称和序列化字段名称会匹配你不必担心。
因此,有额外的领域不会打破你的客户,并满足你的大客户。
你是什么意思的“推荐smth”?在复杂情况下要做什么,例如,我必须更改M2M字段以使用直通选项,因为我需要中间表中的更多字段。我的问题的目标是理解是否更好地将API与模型分离... –