这不是针对特定用例的问题,而是针对我在使用 API 的经验中注意到的一些问题,特别是在使用 Django 和 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__'
当然是它对应的ViewSet和指向它的路由:
http://localhost:8000/api/v1/persons/
请注意,这是我的 API 的第一个版本。
此时一切正常,对吧?
现在,我的客户要求我们需要分别接收人的全名而不是名字和姓氏...
按照预期,我必须将我的模型更改为:
class Person:
full_name = models.CharField(max_length=200)
有 3 个不同的客户端(移动应用程序)使用此版本的 API。显然我不想更改我的 API,相反我想将新方法放入新版本中。
但是第一个版本的序列化程序与模型耦合在一起,所以此时 API 的第一个版本已经更改
我希望在下面的答案中读到你们如何在 Django 中处理这个问题,以及我在使用相同堆栈的下一个项目中应该采取什么方式。
编辑:我的问题的目的是了解将 API 与模型分离是否更好。我已经举了一个非常非常基本的例子,但有些情况下事情会变得更加复杂。例如,我需要修改 M2M 关系以使用 through 选项,以便向中间表添加更多字段。
最佳答案
这种问题可以标记为“推荐 smth”,但无论如何。
首先,您需要使用 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__'
因为您的类字段名和序列化器字段名会匹配,所以您无需担心。
因此,拥有额外的领域不会破坏您的客户并满足您的大客户。
关于django - 如何处理 Django Rest Framework 中的模型更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43851921/