我正在Django中编写一个我使用django-rest-framework的api。我有一个简单的模型,如下所示:
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
}
}
我认为我需要在序列化器类中添加一个create方法。所以我尝试了一下,但是当我将"data"
对象发布到json时,我收到一条消息,要求传感器字段和计数字段。
有人知道我可以在哪里规范化这些数据,以便将其正确地插入数据库吗?
此外,如果我也想通过相同的端点提供数据,该怎么定义?
欢迎所有提示!
答案 0 :(得分:2)
一种可能的方法是在视图级别实现它。如果您使用的是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)