json - 如何在 Django 中验证之前从请求中的子对象获取信息?
问题描述
我正在 Django 中编写一个 api,为此我使用django-rest-framework。我有一个简单的模型如下:
class PeopleCounter(models.Model):
version = models.CharField(max_length=10)
timestamp = models.DateTimeField(db_index=True)
sensor = models.CharField(max_length=10)
count = models.IntegerField()
我有一个序列化程序,如下所示:
class PeopleCounterSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = PeopleCounter
fields = [
'version',
'timestamp',
'sensor',
'count',
]
当我将以下数据发布到此端点时,效果很好:
{
"version": "v1",
"timestamp": "2019-04-01T20:00:00.312",
"sensor": "sensorA",
"count": 4
}
但不幸的是,我需要调整端点以使数据到达如下:
{
"version": "v1",
"timestamp": "2019-04-01T20:00:00.312",
"data": {
"sensor": "sensorA",
"count": 4
}
}
我想我需要向序列化程序类添加一个创建方法。所以我尝试了,但是当我发布带有"data"
对象的 json 时,我收到一条消息,提示传感器字段和计数字段是必需的。
有谁知道我可以在哪里规范化这些数据,以便我可以正确地将其插入数据库?
另外,如果我也想通过这样的同一端点提供数据怎么办,我可以在哪里定义呢?
欢迎所有提示!
解决方案
一种可能的方法是在视图级别实现它。如果您使用 CBV 覆盖get_serializer
这样的内容:
def get_serializer(self, *args, **kwargs):
request_body = kwargs.get("data") # obtain request body
data = request_body.get("data") # get data
request_body.update(data) # add data as request_body attributes
kwargs["data"] = request_body # override received request_body with updated one
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
推荐阅读
- c++ - 相互依赖的类模板和 std::is_base_of 特化
- machine-learning - 什么是机器学习中的可解释性?
- ember.js - Ember.js 服务器响应缓慢,错误“适配器操作超时”
- java - Docker-Tomcat 容器中的 Spring 应用程序在一台主机上运行,在另一台主机上失败
- tibco - TIBCO EMS 在等待确认时哪个超时?
- google-cloud-platform - 通过使用适用于 Google Compute Engine API 的 Node.js 客户端库附加现有磁盘来创建新 VM
- configuration - 如何在独立模式下在集群中配置 jbossfuse 7.0
- bash - 带有 base64 的 Google Speech bash 脚本:意外的令牌。\n
- swift - 通过枚举显示多个 UICollectionViewCells?
- idl-programming-language - 使用 idl 的曲线下面积