gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:43:15 24 4
gpt4 key购买 nike

这不是针对特定用例的问题,而是针对我在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com