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

标签 django rest api django-rest-framework

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

相关文章:

java - 我应该如何在我的 Android 应用程序的 REST API 代码中使用字符串?

java - RESTful 服务方法可以向客户端发送对象吗?

spring - JSON 使用 Spring MVC 3.2 延迟结果错误返回

python - Django-URL 命名空间

python - 在 QuerySet 中获得排名的最有效方法是什么?

json - curl: (6) 无法解析主机:—-header

C# 400 错误请求和长字符 api 有多重要

javascript - 有没有办法使用spotify WEB API来检查spotify是否安装?

python - 具有一对多关系的 Django Form

Django:错误:配置不当的模块未定义 ""类